commit & mutations
mutations
上篇文章提到过在Vuex初始化过程中,注册了mutation。
store为store实例,type为带有namespace的modules内mutations对象的key,handler为其值(函数),local为模块的本地上下文执行环境(mutations所在的模块)。
在注册过后,sotre._mutations对象内部就存储了所有的mutations。
commit
commit核心部分就是key对应的回调函数然后执行
另外,函数的执行是在_withCommit中
_withCommit
_withCommit在commit前将store实例的_committing属性设置为true,执行完为false。
这么做的原因是因为commit的执行目的就是为了改变Vuex里面的数据,而其实这些数据可以直接通过store实例访问并修改。
Vuex推荐使用commit来修改数据,在开发模式下开启严格模式,如果没有用commit函数来修改数据,控制台会报错。
assert
在Windows环境下是没有assert这个API的,不过在node中存在。
Vuex中自定义了assert。
严格模式
在开启严格模式后,会用vue实例观察state(注意sync与deep)。在state数据发生变化后,如果不是通过commit改变的,store._committing为false,就会打印出提示。
dispatch & actions
dispatch也与commit一样,只不过这里还做了一件事。
actions是执行异步动作的,所以用到了promise。执行结果result是一个promise实例,这里也正好对应到了registerAction里对函数执行结果做了Promise处理。
map系列,以mapGetters为例
公共函数:normalizeNamespace
主要是对传入的参数做一个处理,
map的用法详见:vuex.vuejs.org/zh/guide/st…
mapGetters
重点在于normalizeMap部分。
可以看到其核心部分还是调用了this.$store.getters,只不过会对含有命名空间的部分作一个特殊处理。
最后返回的res是一个对象,因此要用对象展开运算符。
normalizedMap
在map系列函数使用的时候可以传入数组/对象参数,参数会被normalizedMap处理,示例在下方注释中。
小结
dispatch & actions,commit & mutations有点类似于发布订阅模式,理解起来很简单。
map系列函数其实只是一个语法糖而言,其根本上还是调用了vm.$store上面的方法。
当然,也有一些其他的API没有研究,等遇到问题的时候再看看源码就行了
最后
其实相比于Vue源码,Vuex相当简单了,并没有很难的地方,只用两篇文章就可以阐述清楚。Vuex其实也是一种状态管理方式而已。三个月前写过一篇react redux的使用文章,juejin.cn/post/684490…
react只是业余世间抽空写过一点代码,其中redux倒是让我花了蛮多时间来理解整个状态管理的流程。而Vuex对于当时还是新手的我上手还是蛮快的。