vuex 采用单一状态树与模块化架构,state、getters、mutations、actions 各司其职:state 是唯一数据源,getters 派生缓存状态,mutations 同步修改 state,actions 处理异步逻辑;模块化通过 namespaced 隔离作用域,支持嵌套、动态注册及跨模块协作,配合类型常量与标准结构提升可维护性。

Vuex 的核心架构围绕“单一状态树”构建,所有共享数据统一存于一个响应式 store 中,通过严格约束的流程(state → getters → mutations → actions → modules)实现可预测的状态变更。模块化不是可选补充,而是大型 Vue 应用维持可维护性的必要设计。
State、Getters、Mutations、Actions 各司其职
每个概念承担明确职责,不可越界:
-
State 是唯一数据源,类似组件的
data(),但全局共享;必须是函数返回对象,确保实例隔离 -
Getters 类似组件的
computed,用于派生状态(如过滤列表、计算总数),支持缓存,可通过mapGetters映射到组件 -
Mutations 是**唯一允许同步修改 state 的方式**,必须显式
commit调用,接收state和payload,禁止异步操作 -
Actions 处理异步逻辑(如 API 请求),内部可调用
commit提交 mutation,支持dispatch触发,可用mapActions简化调用
模块化开发:按功能切分 store
当应用增长,把全部逻辑堆在根 store 会导致文件臃肿、耦合严重。模块化将 store 拆分为独立单元,每个模块包含自己的 state、getters、mutations、actions:
- 模块默认非命名空间(
namespaced: false),方法名易冲突;生产环境建议开启namespaced: true - 开启命名空间后,访问需加前缀,例如:
this.$store.dispatch('auth/login')、this.$store.getters['profile/userInfo'] - 模块可嵌套,支持动态注册(
store.registerModule),适合权限路由或懒加载场景 - 真实项目如 RealWorld 示例,按页面/功能划分模块(
auth.module.js、article.module.js),各模块互不感知,仅通过 store 通信
模块间协作与状态复用
模块并非完全封闭,合理协作能避免重复请求和冗余状态:
- 跨模块读取 state:可通过
rootState参数在 action 或 getter 中访问其他模块状态,例如context.rootState.auth.user - 跨模块调用 mutation/action:使用
{ root: true }选项提交或分发,如commit('SET_LOADING', true, { root: true }) - 公共状态提取:登录态、主题色、语言偏好等高频共用数据,适合放在根模块或单独的
common.module.js中统一管理
模块化落地的关键实践
光拆分模块不够,还需配套规范支撑长期演进:
- 每个模块文件导出标准结构,含
namespaced: true、state()函数、getters对象等,保持一致性 - 类型常量集中管理(如
mutations.type.js),避免字符串硬编码,提升可检索性与重构安全 - 模块内 action 封装完整业务流(请求 → 成功/失败处理 → 提交 mutation),不把副作用泄露到组件中
- 配合 Vue Devtools 调试时,开启命名空间后可在面板中清晰看到各模块的 commit 记录与状态快照
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











