我们现在小程序需要使用状态管理,但因为项目体量实在很小又没必要使用 redux 或者 mobx。所以我打算不负责任的写一个。
createStore
Redux 最核心的部分,提供基础的功能。createStore
接受三个参数:reducer
, initialState
, enhancer
。前两个比较好理解,enhancer
主要用在接受中间件中。返回产物我们主要使用三个方法:getState
, dispatch
, subscribe
。
getState
:获取当前 state 值subscribe
:接受监听,存入listeners
池中dispatch
:处理reducer
操作,触发listeners
方法
所有我们需要的东西都了解清楚了,其他的功能和边缘保护先不考虑,这也是为什么说是不负责任的状态管理(逃
copy
function store(state) {
let currentState = state || {}
let listeners = []
return { getState, dispatch, subscribe }
function getState() {
return currentState
}
function subscribe(listener) {
listeners.push(listener)
}
function dispatch(action) {
action.call(this, currentState)
listeners.forEach(f => f.call(null))
return currentState
}
}
这里修改了一些:订阅没有返回取消订阅操作。原因是懒。。dispatch
并不是接受一个纯函数进行数据更新,而是直接由业务修改状态然后通知更新,所以这其实不能算是一个 redux 产物,并且这很不可控。所以这更像是为了利用react-redux
或者taro-redux
而产生的一种状态保存方式。
原因还是业务比较简单,就是为了存几个不是很关键的数据但不想使用小程序的 storage
去管理而产生的方法。现在不仅满足业务,压缩后也只有 270b
左右,省点空间给小程序代码,有点赚的实际上。