这篇文章主要讲react-redux
的实现原理,同时更好的去理解react
中高阶函数的应用
这里主要实现Provider
组件和connect
函数,新建react-redux
文件夹,里面新建入口文件index.js
,抛出对应组件和方法:react
// react-redux/index.js export { Provider, connect }
第一次使用react-redux
的时候,就感受有点像使用React.Context
,可是子组件内部又是经过props
拿到的数据和方法,这里面connect
函数应该是作了处理,将state
和actions
从新包装后传给了子组件,因此第一步应该先建redux的的Context:redux
// context.js import React from "react"; export default React.createContext();
紧接着建立 Provider.js
文件:数组
//Provider.js import React,{Component} from "react"; import ReduxContext from "./context"; export default class Provider extends Component { render(){ return ( <ReduxContext.Provider value={{ store: this.props.store }}> {this.props.children} </ReduxContext.Provider> ) } }
Provider.js
拿到父组件传过来的store,并把它交给Provider,方便向下传递,接着就是渲染子组件了。app
接下来建立connect.js
,connect
会返回一个函数而且接收渲染的的组件:ide
//connect.js export default function (mapStateToProps,mapDispatchToProps){ return function(WrapperComponent){} }
咱们知道返回的函数最终也是通过执行后再抛出去的,因此返回的应该是一个类组件
或者一个函数组件
,这里用到类组件
会比较合适,由于还要对订阅的更新视图函数进行销毁操做,而后store能够经过向下传递的context
拿到:函数
//connect.js import ReduxContext from './context' import React, { Component } from 'react' export default function (mapStateToProps, mapDispatchToProps) { return function (WrapperComponent) { return class extends Component { static contextType = ReduxContext constructor(props, context) { super(props); // 经过mapStateToProps 返回包装后的state,这里可方便用户拿到想要的state,同时优化渲染的组件 this.state = mapStateToProps(context.store.getState()) } componentDidMount() { // 订阅更新视图 this.unSubscribe = this.context.store.subscribe(() => { this.setState(mapStateToProps(this.context.store.getState())) }) } componentWillUnmount() { // 注销订阅 this.unSubscribe() } } } }
render
里面经过传参的方式,就能够将store里面的值和处理过的action传给子组件了:优化
//connect.js ... render() { // 处理绑定的action let actions = redux.bindActionCreator(mapDispatchToProps,this.context.store.dispatch); return <WrapperComponent {...this.state} {...actions} /> } ...