我们现在小程序需要使用状态管理,但因为项目体量实在很小又没必要使用 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 左右,省点空间给小程序代码,有点赚的实际上。