jtwang7 / Vue-Note

Vue 学习笔记
0 stars 0 forks source link

Vuex 子模块命名空间与【getters / mutations / actions】 #13

Open jtwang7 opened 2 years ago

jtwang7 commented 2 years ago

Vuex 子模块命名空间与【getters / mutations / actions】

参考文章:Vuex 命名空间

✅ 前要 由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。 为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。 分割后需要根据模块名访问子模块的 state:

store.state.xxxModule.yyy

那么问题来了:我们如何访问子模块的 getters / mutations / actions 呢? 答案是:像访问顶层 state / getters 等一样访问子模块即可 (不需要模块名)

store.getters.yyy

✅ 子模块中,模块内的状态是默认嵌套的【被注册在局部命名空间,通过模块名访问】。而默认情况下,模块内部的 action 和 mutation 仍然是注册在全局命名空间的。

这样使得多个模块能够对同一个 action 或 mutation 作出响应。

Getter 同样也默认注册在全局命名空间,但是目前这并非出于功能上的目的(仅仅是维持现状来避免非兼容性变更)。必须注意,不要在不同的、无命名空间的模块中定义两个相同的 getter 从而导致错误。

🔆 如果希望你的模块具有更高的封装度和复用性,你可以通过添加 namespaced: true 的方式使其成为带命名空间的模块。当模块被注册后,它的所有 getter、action 及 mutation 都会自动根据模块注册的路径调整命名。