(一) Action 注册
官方文档:
Action 类似于 mutation,不同在于:
1、Action 提交的是 mutation,而不是直接变更状态。
2、Action 可以包含任意异步操作。
具体代码实现如下:
初始化完成后,store._actions 存储的数据如下

可以看到,_actions 是一个对象,存储了不同模块中自定义的 DetailAction(namespaced:true, 名称是 moduleName+ActionName),
DetailAction则是以数组格式存放,即使 同一个 Store Module 有相同名字的Action,也会被覆盖。
(二)store.dispatch的实现
Action 通过 store.dispatch 方法触发。

如果只有一个entry,然后会执行 registerAction() 里的回调函数 ======》 wrappedActionHandler(),使用 call去调用具体模块的 action。
从代码里可以了解,Vuex使用 Promise去实现异步请求数据。
(三)Getter 注册
Vuex 允许我们在 store 中定义“getter”(可以认为是 store 的计算属性)。
就像Vue的 computed一样,getter 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算。
registerGetter的源代码就更简单了,直接返回一个对象。

我们可以如此在任何组件中使用它: this.$store.getters["模块名/Getter名"],因为getters是一个对象。
(四) makeLocalContext 函数
registerMutation,registerAction,registerGetter 实现,都与 此函数有关。
此函数的作用是 设置 module 上下文环境,为具体模块设置局部的dispatch、commit方法(依据模块是否含有命名空间是否调用根 方法)以及 getters 和 state 。
因为local 对象的 getters 与 state 是动态获取的,因此作者重写了 对象的 get 方法。
这里动态调用方法,我们在 commit() 以及 dispatch() 则会触发 local.getters.makeLoalGetters()、getNestedState().
整个Vuex 代码中运用了大量的闭包。
浙公网安备 33010602011771号