简单的状态管理器
我们先以一个简单的计数器为例:
1 | // 我们定了一个状态(state),它有一个 count 属性。 |
如上,我们实现了状态的修改与使用。但有一个问题是,当我们修改了 count 后,使用了 count 的地方并没有收到任何通知。这个时候,我们需要引入 发布-订阅模式。
1 | /*------count 的发布订阅者实践------*/ |
现在我们来尝试一下:
1 | // 当 count 改变的时候,实时输出新的值 |
到目前为止,我们实现了发布与订阅。当state的数据发生变化的时候,就会通知订阅者。
但现在又有了新的问题:
- 这个状态管理器只能管理 count,不够通用
- 公共的代码应该封装起来
所以我们再改动一下:
1 | const createStore = function (initState) { |
我们使用 createStore 做了一次封装,接收 initState 作为初始化的状态,对外暴露了 3 个接口:
- subscribe 订阅
- changeState 修改状态
- getState 获取状态
试一下:
1 | let initState = { |
到这里为止呢,我们就完成了一个简单的状态管理器。
有计划的状态管理器
我们利用上面的状态管理器来实现一个自增、自减的计数器。
1 | let initState = { |
前面都没什么问题,但我们发现,好好的计数器 count 突然就变成字符串了。这是因为我们没有对 count 的修改做任何的约束。
那我们分成2步来解决这个问题:
- 制定一个 state 修改计划,告诉 store,我的修改计划是什么。
- 修改 store.changeState 方法,告诉它修改 state 的时候,按照我们的计划修改。
我们来设置一个 plan 函数,接收现在的 state,和一个 action,返回经过改变后的新的 state。
1 | function plan(state, action) { |
现在,我们把这个约束传给 store,以后所有的变化都要按照这个规范来:
1 | // 增加一个参数 plan |
现在我们再来试一下:
1 | let initState = { |
其实呢,把 plan 和 changeState 改名为 reducer 和 dispatch,就是我们熟悉的 Redux 接口了呢!那么接下来,就用 reducer 和 dispatch 来代替他们了。
相关链接
Redux 简单实现(二):多文件协作
Redux 简单实现(三):中间件
Redux 简单实现(四):react-redux
参考资料: