Provider

  1. // Provider把store放到context里,所有的子元素可以直接取到store
  2. import React from 'react'
  3. import PropTypes from 'prop-types'
  4. import {bindActionCreators} from './utils.js'
  5. export const connect = (mapStateToProps=state=>state,mapDispatchToProps={})=>(WrapComponent)=>{
  6. return class ConnectComponent extends React.Component{
  7. static contextTypes = {
  8. store:PropTypes.object
  9. }
  10. constructor(props, context){
  11. super(props, context)
  12. this.state = {
  13. props:{}
  14. }
  15. }
  16. componentDidMount(){
  17. const {store} = this.context
  18. store.subscribe(()=>this.update())
  19. this.update()
  20. }
  21. update(){
  22. const {store} = this.context
  23. const stateProps = mapStateToProps(store.getState())
  24. const dispatchProps = bindActionCreators(mapDispatchToProps, store.dispatch)
  25. this.setState({
  26. props:{
  27. ...this.state.props,
  28. ...stateProps,
  29. ...dispatchProps
  30. }
  31. })
  32. }
  33. render(){
  34. return <WrapComponent {...this.state.props}></WrapComponent>
  35. }
  36. }
  37. }
  38. export class Provider extends React.Component{
  39. static childContextTypes = {
  40. store: PropTypes.object
  41. }
  42. getChildContext(){
  43. return {store:this.store}
  44. }
  45. constructor(props, context){
  46. super(props, context)
  47. this.store = props.store
  48. }
  49. render(){
  50. return this.props.children
  51. }
  52. }

utils.js

  1. export function createStore(reducer, enhancer){
  2. if (enhancer) {
  3. return enhancer(createStore)(reducer)
  4. }
  5. let currentState = {}
  6. let currentListeners = []
  7. function getState(){
  8. return currentState
  9. }
  10. function subscribe(listener){
  11. currentListeners.push(listener)
  12. }
  13. function dispatch(action){
  14. currentState = reducer(currentState, action)
  15. currentListeners.forEach(v=>v())
  16. return action
  17. }
  18. dispatch({type:'@IMOOC/WONIU-REDUX'})
  19. return { getState, subscribe, dispatch}
  20. }
  21. // 自定义applyMiddleware函数
  22. export function applyMiddleware(...middlewares){
  23. return createStore=>(...args)=>{
  24. const store = createStore(...args)
  25. let dispatch = store.dispatch
  26. const midApi = {
  27. getState:store.getState,
  28. dispatch:(...args)=>dispatch(...args)
  29. }
  30. const middlewareChain = middlewares.map(middleware=>middleware(midApi))
  31. dispatch = compose(...middlewareChain)(store.dispatch)
  32. return {
  33. ...store,
  34. dispatch
  35. }
  36. }
  37. }
  38. // 自定义compose函数
  39. export function compose(...funcs){
  40. if (funcs.length==0) {
  41. return arg=>arg
  42. }
  43. if (funcs.length==1) {
  44. return funcs[0]
  45. }
  46. return funcs.reduce((ret,item)=> (...args)=>ret(item(...args)))
  47. }
  48. function bindActionCreator(creator, dispatch){
  49. return (...args) => dispatch(creator(...args))
  50. }
  51. export function bindActionCreators(creators,dispatch){
  52. return Object.keys(creators).reduce((ret,item)=>{
  53. ret[item] = bindActionCreator(creators[item],dispatch)
  54. return ret
  55. },{})
  56. }

react之自定义react-redux的provider、connect的更多相关文章

  1. react之自定义迷你redux的实现

    export function createStore(reducer){ let currentState={} let currentListeners=[] function getState( ...

  2. React深入 - 手写redux api

    简介: 手写实现redux基础api createStore( )和store相关方法 api回顾: createStore(reducer, [preloadedState], enhancer) ...

  3. 如何在非 React 项目中使用 Redux

    本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...

  4. 如何优雅地在React项目中使用Redux

    前言 或许你当前的项目还没有到应用Redux的程度,但提前了解一下也没有坏处,本文不会安利大家使用Redux 概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与 ...

  5. 优雅的在React项目中使用Redux

    概念 首先我们会用到哪些框架和工具呢? React UI框架 Redux 状态管理工具,与React没有任何关系,其他UI框架也可以使用Redux react-redux React插件,作用:方便在 ...

  6. 前端笔记之React(五)Redux深入浅出

    一.Redux整体感知 Redux是JavaScript状态管理容器,提供了可被预测状态的状态管理容器.来自于Flux思想,Facebook基于Flux思想,在2015年推出Redux库. 中文网站: ...

  7. react聊天室|react+redux仿微信聊天IM实例|react仿微信界面

    一.项目概况 基于react+react-dom+react-router-dom+redux+react-redux+webpack2.0+react-photoswipe+swiper等技术混合开 ...

  8. react,react-router,redux+react-redux 构建一个React Demo

    创建初始化应用 加速我们的npm. npm install -g cnpm --registry=https://registry.npm.taobao.org 利用create-react-app ...

  9. react第十七单元(redux和组件之间的通信,react-redux的相关api的用法)

    第十七单元(redux和组件之间的通信,react-redux的相关api的用法) #课程目标 什么是redux-redux react-redux的作用是什么 react-redux如何应用 #知识 ...

  10. react中的hoc和修饰器@connect结合使用

    在学习react-redux的时候,看到了修饰器这个新的属性,这个是es7的提案属性,很方便.于是我用@connect代替了connect(使用的时候需要配置,这里不赘述),省去了很多不必要的代码,但 ...

随机推荐

  1. 中南大学2018年ACM暑期集训前期训练题集(入门题) X: 又一道简单题

    简直智障,上一题V题,样例输出里面的“Case:”不要输出,到了这题又是要输出的了 #include<iostream> using namespace std; int num[1000 ...

  2. Linux集群部署自定义时间同步服务器(ntpd)

    Linux集群部署自定义时间同步服务器(ntpd) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 身为一名运维人员,在搭建集群的时候,第一步需要做的就是同步每个机器的时间,尤其是在 ...

  3. Python新手入门英文词汇笔记(转)

    一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...

  4. python---redis缓存页面前戏之剖析render源码

    1.初始代码: def get(self, *args, **kwargs): import time tm = time.time() self.render('home/index.html', ...

  5. java8的新特性详解-----------Lamda表达式

    java8最大的亮点就是引入了Lamda表达式  , 函数式编程的概念  具体啥意思我也不知道.只管用就行了,非常的强大,简洁,一个表达式相当于以前的十几行代码  因为之前要实现这种效果全靠if el ...

  6. SparkSQL和DataFrame

    SparkSQL和DataFrame SparkSQL简介 Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象叫做DataFrame并且作为分布式SQL查询引擎的作用.它 ...

  7. FZU - 1688 Binary land

    题目链接  Problem 1688 Binary land Accept: 72    Submit: 171Time Limit: 1000 mSec    Memory Limit : 3276 ...

  8. QT_文本编辑器_源码下载

    源码下载: 链接: http://pan.baidu.com/s/1c21EVRy 密码: qub8 实现主要的功能有:新建,打开,保存,另存为,查找(查找的时候需要先将光标放到最下面位置才能查全,不 ...

  9. Thrift 安装及使用

    前言:由于最近在看storm Topology提交过程的源代码,写好的topology jar文件是通过Thrift RPC的形式提交给nimbus的.故了解下Thrift的基本原理. 参考:http ...

  10. JAVA泛型中的类型擦除及为什么不支持泛型数组

    一,数组的协变性(covariant array type)及集合的非协变性 设有Circle类和Square类继承自Shape类. 关于数组的协变性,看代码: public static doubl ...