Vuex模块需显式设置namespaced: true才能隔离作用域,否则同名mutations/actions会覆盖;启用后必须用模块前缀调用,如'user/setName';跨模块通信应通过rootState、rootGetters或{ root: true }选项,避免硬编码路径。
Vuex 通过 namespaced: true 开启模块命名空间,让每个模块的 state、getters、mutations 和 actions 都被限定在自己的作用域内,从根本上避免同名项互相覆盖或误触发。
默认情况下,所有模块都注册在全局命名空间,哪怕拆成多个文件,只要 mutation 名叫 setUser,就只有一个生效——后注册的会覆盖前一个。只有把模块配置中的 namespaced: true 明确写上,该模块才真正“自立门户”。漏写或写成 false,等于没隔离。
export default { namespaced: true, state: ..., mutations: { ... } }
export default { state: ..., mutations: { ... } }(无 namespaced 字段,默认为 false)modules 对象中定义的 key 决定,比如 user: userModule,那它的命名空间就是 user/
启用后,所有访问都要加前缀,否则找不到。这不是额外负担,而是强制你明确来源,提升可读性和可维护性。
commit('user/setName', 'Alice'),不能只写 commit('setName')
dispatch('user/login', credentials)
mapState('user', ['name', 'email']) 或 mapGetters('user', ['fullName'])
$store.state.user.name,不能省略 user.
不同模块之间需要共享数据或触发逻辑时,不能靠拼接字符串硬调用,否则耦合严重、难以测试和重构。
rootState,例如 rootState.cart.items
rootGetters['cart/itemCount'],而不是把 cart 的 getter 复制到 user 模块里{ root: true } 选项,如 commit('clearCart', null, { root: true }),表示去根空间找运行时用 store.registerModule('admin', adminModule) 加载模块时,如果 adminModule 没设 namespaced: true,它依然会污染全局命名空间。动态模块和静态模块一样,隔离规则完全一致。
namespaced: true
store.unregisterModule('admin'),避免残留registerModule('orderDetail', module),其空间就是 orderDetail/