Vuex 之二

141 阅读2分钟
原文链接: mp.weixin.qq.com

当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放 The Marriage of Figaro German Opera Orchestra of Berlin - I Love You Phillip Morris (Soundtrack)

这是介绍Vuex的续篇,内容包括使用store构建模块以及如何运用插件plugin,未读过首篇,你可以点击GitHub项目:Vuex获得详情。

二、module 与 命名空间

把所有的状态都写在单一状态树里,这意味一个store对象的state选项会包含几乎所有的状态片段,这的确是太臃肿了,是的没人喜欢臃肿,包括文章的长度,不仅如此可能还难以管理!类似安卓手机的分身模式,引入模块,就是希望vuex能够多重地解决“分身”的问题。真正的开始:

模块(Module)可以通过store选项modules体现出来,如:

不难理解,模块的局部状态和全局的store实例的状态调用、提交方式是一致的,如getters和mutations选项。具体的区别体现在:

a、当使用actions进行提交操作时,模块内的actions的入参对象(即context)多了一个属性rootState,而不是类似getters和mutations,仅提交state状态作为第一参数,没错!actions的第一参数是一个context的对象,并且rootState属性只存在模块actions。其中state仅仅是该对象的字段之一,这就是上一篇文尾(请戳 GitHub项目:Vuex)提到的actions的contex对象,可以调用state及getters的原因,完整的contexts对象如下:

 state

 rootState

 commit  

 dispatch

 getters

b、除了actions,getters也体现了一些区别,读者肯定了解在全局的store实例中,getters可以接受参数包括:

state        // 第一入参

getters     // 第二入参

而注册局部模块的getters时,多了rootState和rootGetters,也就是:

state              // 第一入参

getters           // 第二入参

rootState       // 第三入参

rootGetters    // 第四入参

命名空间(namespace)

通常情况下,尽管是在模块下注册的state,getters,mutations等等,这些属性仍是全局命名空间的一部分,因此不同模块之间若要共享状态,只要正确引用即可,如操作 MelonA 下的模块 MelonA_1 属性mutations方法:

commit("MelonA/keyInA_1")

增加命名空间属性,如在子模块 MelonA_1 中添加属性namespaced:true。那么引用方法就发生了变化,需要这样:

commit("MelonA/MelonA/keyInA_1")

以后,这种引用方式将在vuex模块中非常常见。

待续...


原创内容,转载请注明出处

侵权必究@melonman