刚刚写了一半还是删了,因为我贴了好多代码,我感觉还是思路最重要,所以代码就放在最后的github地址了
以下是正文
react-redux
我们都知道react-redux是处理状态管理的,它把状态放在了一个全局的唯一的对象里面
这个对象需要提供
- 获取这个对象的方法-getstate
- 需要提供可以改变状态的方法-dispatch
- 需要在状态改变的时候通知订阅这个状态的组件方法 -subscribe
当我创建完成这个对象之后,我们需要
- 把这个对象传给子孙后代,所以需要Provider
- 子孙后代要用怎么办?所以要connect,但是子代不需要所有的状态和改变状态的方法,所以有了mapStateToProps和mapDispatchToProps
实现Provider可以用context api来实现
connect实际上是一个高阶组件,使用方法是connect(子组件需要的state,子组件需要的改变状态的方法,子组件本身)
- 在connect里把全局状态和改变state方法根据传过来的mapstatetoprops和mapdispatchtoprops进行过滤
- 把子组件需要的传给子组件之后返回子组件
中间件
中间件是为了我们在发出action和dispatch之前做一些我们自己想做的事情,比如说打印日志,改造dispatch接收的参数等等
中间件的作用是返回一个全新的store,它的dispatch被增强了
下面是创建带有中间件的store
const store = createStore(
reducer,
applyMiddleware(thunk,promise)
);
所以
- 需要改造原来的createStore方法,如果有中间件这个增强器,就使用增强版的store
- 在applyMiddleware函数里面把所有的中间件聚合,让原来的dispatch得到增强,实现如可以接受函数或者promise对象作为参数
中间件与其说是技术,不如说是一种思想,顾名思义,在A和B之间做一些事情,从而满足我们的需求
完整代码地址:https://github.com/dz333333/toy-redux
ps:我在实现redux的时候发现他是使用发布订阅的模式,在实现subscribe的时候让我想起了我之前写的vue双向绑定里reactive里proxy在set的时候需要执行一些副作用effect,都需要收集依赖,然后redux是坚持单项数据流,数据不可变,reducer只能是纯函数,但是mobx却是双向绑定,在组件里就可以直接改变全局状态,我就想mobx是不是用proxy也可以实现,一通瞎想之后,感觉有些东西真的都是通了,原来如此的感觉,以前设计模式也不在意,这次才发现发布订阅是如此的常用,vue在用,mobx也可以用,以后要多学习学习了