动手实现 redux
文章地址 实例回顾
假如按钮和界面不在同一组件,经常用 ... const Test = ({ colorTheme,authorName }) => <div className='texts' style={{color: colorTheme}} > Hello World - { authorName } </div> const mapStateToProps = state => ({ colorTheme: state.colorTheme,authorName: state.authorName }) ... 用过 redux 属性分析关于我们常用到的内容,首先我们要考虑 动手实现 redux实现 createStoreexport default reducer => { let state = null let listeners = [] const subscribe = listener => { listeners.push(listener) return () => { listeners = listeners.filter(d => d !== listener) } } const getState = () => state const dispatch = action => { state = reducer(state,action) listeners.forEach(listener => listener()) } dispatch() return { getState,dispatch,subscribe } } 这个模块直接 实现 reducerconst initState = { ... } export default (state,action) => { if (!state) return initState switch (action.type) { ... } } 关于 实现 Providerclass Provider extends Component { getChildContext () { return { store: this.props.store } } ... } 这里必须提一下 实现connectconst connect = (mapStateToProps,mapDispatchToProps) => (WrappedComponent) => { class InnerComponent extends Component{ constructor (props,context) { super(props) const { getState,subscribe } = context.store this.state = { ...props,...mapStateToProps(getState()),...mapDispatchToProps(dispatch) } subscribe(() => this._updateStore()) } _updateStore = () => { const { getState,dispatch } = this.context.store const allProps = { ...this.props,...mapDispatchToProps(dispatch) } this.setState({ ...allProps }) } render () { return ( <WrappedComponent {...this.state} /> ) } } InnerComponent.contextTypes = { store: PropTypes.object } return InnerComponent } 高阶组件这个概念我们在官网上也可以看的到 Higher-Order Components,简单理解就是传入一个组件返回一个新的组件,它内部做什么事情则有你自己定义,我们这里实现
至此我们的简易得逻辑已经实现,代码github上有【reacts-ggsddu】,大家可以下载本地运行感受一下 参考
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |