Vuex源码解析(二):API

679 阅读2分钟

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对于当时还是新手的我上手还是蛮快的。