react-redux简易实现

刚刚写了一半还是删了,因为我贴了好多代码,我感觉还是思路最重要,所以代码就放在最后的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也可以用,以后要多学习学习了

发表评论

您的电子邮箱地址不会被公开。