博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react之自定义react-redux的provider、connect
阅读量:6736 次
发布时间:2019-06-25

本文共 3098 字,大约阅读时间需要 10 分钟。

Provider

// Provider把store放到context里,所有的子元素可以直接取到storeimport React from 'react'import PropTypes from 'prop-types'import {bindActionCreators} from './utils.js'export const connect = (mapStateToProps=state=>state,mapDispatchToProps={})=>(WrapComponent)=>{    return class ConnectComponent extends React.Component{        static contextTypes = {            store:PropTypes.object        }        constructor(props, context){            super(props, context)            this.state = {                props:{}            }        }        componentDidMount(){            const {store} = this.context            store.subscribe(()=>this.update())            this.update()        }        update(){            const {store} = this.context            const stateProps = mapStateToProps(store.getState())            const dispatchProps = bindActionCreators(mapDispatchToProps, store.dispatch)            this.setState({                props:{                    ...this.state.props,                    ...stateProps,                    ...dispatchProps                    }            })        }        render(){            return 
} }}export class Provider extends React.Component{ static childContextTypes = { store: PropTypes.object } getChildContext(){ return {store:this.store} } constructor(props, context){ super(props, context) this.store = props.store } render(){ return this.props.children }}

utils.js

export function createStore(reducer, enhancer){    if (enhancer) {        return enhancer(createStore)(reducer)    }    let currentState = {}    let currentListeners = []    function getState(){        return currentState    }    function subscribe(listener){        currentListeners.push(listener)    }    function dispatch(action){        currentState = reducer(currentState, action)        currentListeners.forEach(v=>v())        return action    }    dispatch({type:'@IMOOC/WONIU-REDUX'})    return { getState, subscribe, dispatch}}// 自定义applyMiddleware函数export function applyMiddleware(...middlewares){    return createStore=>(...args)=>{        const store = createStore(...args)        let dispatch = store.dispatch        const midApi = {            getState:store.getState,            dispatch:(...args)=>dispatch(...args)        }        const middlewareChain = middlewares.map(middleware=>middleware(midApi))        dispatch = compose(...middlewareChain)(store.dispatch)        return {            ...store,            dispatch        }    }}// 自定义compose函数export function compose(...funcs){    if (funcs.length==0) {        return arg=>arg    }    if (funcs.length==1) {        return funcs[0]    }    return funcs.reduce((ret,item)=> (...args)=>ret(item(...args)))}function bindActionCreator(creator, dispatch){    return (...args) => dispatch(creator(...args))}export function bindActionCreators(creators,dispatch){    return Object.keys(creators).reduce((ret,item)=>{        ret[item] = bindActionCreator(creators[item],dispatch)        return ret    },{})}

转载于:https://www.cnblogs.com/raind/p/9690744.html

你可能感兴趣的文章
《版式设计——日本平面设计师参考手册》—第1章段落样式和字符样式的应用...
查看>>
《软件工艺师:专业、务实、自豪》一3.7.1 软件工艺峰会
查看>>
《善用佳软:高效能人士的软件应用之道》一2.4 项目管理:免费Project查看软件汇总...
查看>>
Galera 将死 — MySQL Group Replication 发布
查看>>
Mozilla 发现用于中间人攻击的证书
查看>>
Docker 中管理数据 【已翻译100%】
查看>>
《Unity 5.x游戏开发实战》一2.2 Unity中的C#脚本
查看>>
《OOD启思录》—第2章2.3节 类耦合与内聚
查看>>
【好书推荐】适合开发者学习DevOps的5本好书
查看>>
11个Linux基础面试问题
查看>>
《嵌入式 Linux C 语言应用程序设计(修订版)》一导读
查看>>
《Python金融大数据分析》一2.3 延伸阅读
查看>>
Android View事件传递详解
查看>>
Elasticsearch-SQL
查看>>
我的失败与伟大 —— 上市之后的规划
查看>>
【Spark Summit East 2017】不必犹豫,使用Spark 2.0结构化流
查看>>
HTTPFS: 基于HTTP操作hadoop hdfs文件系统
查看>>
使用jquery获取父元素或父节点的方法
查看>>
如何让双十一数据大屏讲出故事?设计有口诀
查看>>
浮窗系列之窗口与用户输入系统
查看>>