当前浏览器不支持播放音乐或语音,请在微信或其他浏览器中播放
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