Vuex mapState在namespaced:false模块下是否必须传入模块名?
嘿,我来帮你理清这个Vuex mapState的困惑,这其实是个很容易混淆的点!
核心结论先给你
首先明确:Vuex模块的state,无论你是否设置namespaced: false(默认值),都会被挂载到根状态(rootState)的模块键名之下,而不是直接合并到根状态的顶层。namespaced选项只影响模块的mutations、actions、getters是否合并到全局命名空间,对state的挂载方式没有影响。
这就是为什么你必须用...mapState('modulename', ['someStateAttribute'])才能映射到模块里的state——因为这个state实际上是rootState.modulename.someStateAttribute,而不是rootState.someStateAttribute。
再拆解一下mapState的正确用法
针对不同场景,mapState的使用方式不同:
- 映射根状态的属性:直接传属性名数组即可
...mapState(['rootLevelAttribute']) - 映射模块状态(无论模块是否开启命名空间):
- 方式一:传入模块名作为第一个参数,再传属性名数组
...mapState('modulename', ['someStateAttribute']) - 方式二:用函数形式手动从根state中取模块的属性
...mapState({ someStateAttribute: state => state.modulename.someStateAttribute })
- 方式一:传入模块名作为第一个参数,再传属性名数组
你预期的“直接映射”怎么实现?
如果你希望某个state属性属于全局/根命名空间,可以直接把它定义在根state里,而不是放在模块中:
// store/index.js export default new Vuex.Store({ state: { someStateAttribute: '我是全局状态' // 直接定义在根state }, modules: { // 你的其他模块... } })
这时你就能用...mapState(['someStateAttribute'])直接映射了。
最后再确认一下
你遇到的情况是完全符合Vuex的设计逻辑的,不是配置遗漏——只是对namespaced选项的作用范围理解有误。记住:namespaced管的是mutations/actions/getters的命名空间,不管state的挂载位置;模块的state永远是嵌套在根state的模块键名下的。
内容的提问来源于stack exchange,提问作者epeleg
相关产品推荐
相关产品推荐

