鲜荣彬
Herry

(一) 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 代码中运用了大量的闭包。

  

posted on 2017-12-27 20:11  Herry彬  阅读(190)  评论(0)    收藏  举报