Module
PS:虽然支持module,但不支持namespace。在MPX里,我们更推荐使用多实例模式
当应用变得非常复杂时,store 对象就有可能变得相当臃肿。
为了解决以上问题,mpx内置store 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割:
import {createStore} from '@mpxjs/core'
const moduleA = {
state: { ... },
mutations: { ... },
actions: { ... },
getters: { ... }
}
const moduleB = {
state: { ... },
mutations: { ... },
actions: { ... }
}
const store = createStore({
modules: {
a: moduleA,
b: moduleB
}
})
store.state.a // -> moduleA 的状态
store.state.b // -> moduleB 的状态
export default store
模块的局部状态
对于模块内部的 mutation 和 getter,接收的第一个参数是模块的局部状态对象。
const moduleA = {
state: { count: 0 },
mutations: {
increment (state) {
// 这里的 `state` 对象是模块的局部状态
state.count++
}
},
getters: {
doubleCount (state) {
return state.count * 2
}
}
}
同样,对于模块内部的 action,局部状态通过 context.state
暴露出来,根节点状态则为 context.rootState
:
const moduleA = {
// ...
actions: {
incrementIfOddOnRootSum ({ state, commit, rootState }) {
if ((state.count + rootState.count) % 2 === 1) {
commit('increment')
}
}
}
}
对于模块内部的 getter,根节点状态会作为第三个参数暴露出来:
const moduleA = {
// ...
getters: {
sumWithRootCount (state, getters, rootState) {
return state.count + rootState.count
}
}
}
模块在组件中的引入方式
const store = createStore({
modules: {
a: {
state: {
name: 1
},
getters: {
getName: s => s.name
}
},
b: moduleB
}
})
createComponent({
computed: {
// mapState引入module方式有两种
...store.mapState({
test: 'a.name'
}),
...store.mapState('a', ['name']),
...store.mapGetters('getName') // 由于没有提供namespace概念,所以getters都是全局的,类似的还有mutations & actions
}
})