由於使用單一狀態樹,應用的所有狀態會集中到一個比較大的物件。當應用變得非常複雜時,store 物件就有可能變得相當臃腫。為了解決以上問題,Vuex 允許我們將 store 分割成模組(module)。每個模組擁有自己的state、mutation、action、getter、甚至是巢狀子模組——從上至下進行同樣方式的分割:
如何使用module
在store資料夾下新建modules資料夾,並在下面建立moduleA.js和moduleB.js檔案用來存放vuex的modules模組
moduleA.js檔案內容如下:
const state = {
stateA: 'A'
}
const mutations = {
showA (state) {
return state.stateA
}
}
const actions = {
showAAction (context) {
context.commit('showA')
}
}
const getters = {
getA (state) {
return state.stateA
}
}
export default {state, mutations, actions, getters}
複製程式碼
moduleB.js檔案內容如下:
const state = {
stateB: 'B'
}
const mutations = {
showA (state) {
return state.stateB
}
}
const actions = {
showAAction (context) {
context.commit('showB')
}
}
const getters = {
getA (state) {
return state.stateB
}
}
export default {state, mutations, actions, getters}
複製程式碼
store.js 檔案內容如下:
import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import mutations from './mutations'
import getters from './getters'
import actions from './actions'
import moduleA from './modules/moduleA'
import moduleB from './modules/moduleB'
Vue.use(Vuex)
const store = new Vuex.Store({
state,
mutations,
getters,
actions,
modules: {
moduleA,
moduleB
}
export default store
複製程式碼
在元件中使用
<template>
<div class="modules">
<h1>{{moduleA}} --- {{moduleB}}</h1>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
data () {
return {}
},
computed: {
...mapState({
moduleA: state => state.moduleA.stateA,
moduleB: state => state.moduleB.stateB
})
}
}
</script>
複製程式碼
模組動態註冊
在 store 建立之後,你可以使用 store.registerModule 方法註冊模組:
// 註冊模組 `myModule`
store.registerModule('myModule', {
// ...
})
// 註冊巢狀模組 `nested/myModule`
store.registerModule(['nested', 'myModule'], {
// ...
})
複製程式碼
之後就可以通過 store.state.myModule 和 store.state.nested.myModule 訪問模組的狀態。模組動態註冊功能使得其他 Vue 外掛可以通過在 store 中附加新模組的方式來使用 Vuex 管理狀態。例如,vuex-router-sync 外掛就是通過動態註冊模組將 vue-router 和 vuex 結合在一起,實現應用的路由狀態管理。你也可以使用 store.unregisterModule(moduleName) 來動態解除安裝模組。注意,你不能使用此方法解除安裝靜態模組(即建立 store 時宣告的模組)。