c语言编程笔录

首页 >   > 笔记大全

笔记大全

Vuex命名空间namespaced怎么使用

更新时间:2023-10-29
### 什么是Vuex命名空间? 命名空间是一种隔离作用域,将模块中定义的所有的 action、mutation、getter和state封装到命名空间中,使得不同模块内的同名action、mutation、getter和state不会发生冲突。Vuex通过`namespaced`属性提供了namespace模式。默认情况下,`namespaced`是 `false`。如果需要开启命名空间,则需要将其设置为`true`。 下面是一个基本的示例,其中,示例中的`counter`是一个module,且启用了命名空间模式: ```javascript const store = new Vuex.Store({ modules: { counter: { namespaced: true, // 开启命名空间模式 state: { count: 0 }, mutations: { increment (state) { state.count++ } }, actions: { incrementIfOddOnRootSum ({ state, commit, rootState }) { if ((state.count + rootState.count) % 2 === 1) { commit('increment') } } }, getters: { doubleCount (state) { return state.count * 2 } } } } }) ``` ### 在命名空间模式下使用action 在命名空间模式下,action需要以模块名为前缀进行访问。例如,下面的代码展示了如何使用action。 ```javascript store.dispatch('counter/increment') ``` 如果在调用action时需要访问全局state,可以使用`rootState`属性。示例: ```javascript const store = new Vuex.Store({ state: { count: 0 }, modules: { a: { namespaced: true, actions: { increment ({ commit, rootState }) { commit('increment') commit('increment', { amount: 10 }, { root: true }) } } } } }) ``` ### 在命名空间模式下使用mutation 在命名空间模式下,mutation需要以模块名为前缀进行访问。例如,下面的代码展示了如何使用mutation。 ```javascript store.commit('counter/increment') ``` 如果需要访问模块内的state,可以使用`state`属性。示例: ```javascript const store = new Vuex.Store({ modules: { account: { namespaced: true, state: { balance: 0 }, mutations: { deposit (state, amount) { state.balance += amount } }, actions: { deposit ({ commit }, amount) { commit('deposit', amount) } } } } }) ``` ### 在命名空间模式下使用getter 在命名空间模式下,getter也需要以模块名为前缀进行访问: ```javascript store.getters['counter/doubleCount'] // -> 6 ``` 在模块内部定义的getter和在使用中定义的getter是需要区分的。下方展示的是定义在模块内的getter: ```javascript const store = new Vuex.Store({ modules: { account: { namespaced: true, state: { balance: 0 }, getters: { balance (state) { return state.balance } } } }, getters: { accountBalance (state, getters, rootState) { return getters['account/balance'] } } }) ``` ### 总结 Vuex提供了强大的命名空间模式,可以有效避免在模块之间产生命名冲突。使用命名空间模式时,需要注意不仅需要在模块定义时设置命名空间(通过模块的 `namespaced:true`属性),同时在访问action、mutation和getter时,也需要使用模块名作为前缀。通过上述代码示例,不难发现,在命名空间模式下,我们需要格外注意模块与全局的关系,并谨慎设计命名空间的结构,才能发挥最优效果。同时,为了便于模块内部的一致性操作,建议在模块内定义好各种需要使用的action、mutation和getter,避免在使用时误引用全局的状态。