经过一段时间的思考和摸索,我为团队提供了下面的一套新的、以数据流为基础的、跨越视图层和业务service 层的应用状态管理方案:
- 增加
xService
概念,每个业务模块都可以拥有的独立的controller,用于连接agent 层和视图层。xService 中可按需要创建和持有模块的状态数据; - 上面提到的模块状态数据,我参考了
ngrx/platform
中的store
设计,在项目中引入了XStateSubject,一种继承于Observable.BehaviorSubject,提供类似于Vuex mutation 的方式来修改数据的对象; - xService 中持有的XStateSubject 建议都会暴露一个只读的流给外界(比如Vue 实例)订阅,而修改XStateSubject 则需要通过dispatch 某个action,并附带对应payload 来完成;
- Vue 视图层则配合
vue-rx
中的subscriptions
来替代原来的computed
;
在实践中,甚至连Vue 视图层的data
我都很大程度上弃用。Vue 实例中对data 的读取是很方便的,this.dataName
即可,但在设置data 数据时就显得过于没有成本了,简单的this.dataName = 'say something'
,就能修改状态数据,这种低成本setter 操作让我很没有安全感。于是配合subscriptions
和XStateSubject
,我有意地将让数据更新的操作变得更加有指引性。
不是一个完备的JS 工具库,单纯从项目中抽取出来的而已。