VUE中 为什么是 this.$store.state.user.name,而不是 this.$store.user.state.name?
$store 是 Vue 实例的一个属性,用来访问
和管理全局
的 Vuex 状态管理对象,它包含了应用的 状态(state)、变更方法(mutations)、异步操作(actions)、和 派生数据(getters),从而实现组件之间的状态共享和管理。
1. this.$store
是什么?
在 Vue 中,this.$store
是整个 Vuex store 实例,包含所有模块、state、getters、mutations、actions 等内容。
2. Vuex 的数据结构是什么样的?
假设你定义了一个模块叫 user
,模块中的 state
是:
user: {state: {name: '张三'},...
}
那么最终的整个 store 的结构会是这样:
{state: {user: {name: '张三'}},mutations: { ... },actions: { ... }
}
也就是说:
user
模块的state
被合并到了 总的state
对象下的user
属性里。
所以访问方式是:
this.$store.state.user.name
翻译一下就是:
this.$store
: 整个 Vuex 实例.state
: 顶级状态对象.user
:user
模块.name
: 模块中的 name 字段
为什么不是 this.$store.user.state.name
?
因为 this.$store
上 没有直接挂载模块名(如 user
)的属性。模块里的 state
都是被合并到了 $store.state
这个顶级对象中。
所以 访问模块状态的正确路径是:
this.$store.state.<模块名>.<字段名>
而不是:
this.$store.<模块名>.state.<字段名> // ❌ 不存在这样结构
延伸补充:命名空间模块
如果你使用了 namespaced: true
的模块,你的 getters
、actions
、mutations
也需要加模块名调用,例如:
dispatch('user/login')
commit('user/SET_NAME')
但访问 state
时仍然是:
this.$store.state.user.name
✅ 总结
你想访问的内容 | 正确写法 |
---|---|
模块中的 state | this.$store.state.user.name |
模块中的 mutation | this.$store.commit('user/XXX') |
模块中的 action | this.$store.dispatch('user/XXX') |
模块中的 getter | this.$store.getters['user/XXX'] |