Vuex 有哪几个核心属性?(State, Getter, Mutation, Action, Module)
Vuex 的核心属性确实就是你列出的这 5 个:State、Getter、Mutation、Action、Module。
下面我为你详细解析每一个属性的作用、特点以及它们之间的关系:
1. State(单一状态树)
- 定义:Vuex 使用“单一状态树”,即用一个对象就包含了全部的应用层级状态。
- 类比:相当于 Vue 组件中的
data。 - 作用:存储应用中需要共享的数据。
- 特点:
- 数据是响应式的。
- 在组件中通常通过
this.$store.state.xxx访问,或者使用mapState辅助函数映射到计算属性中。
2. Getter(派生状态)
- 定义:从 State 中派生出一些状态(例如:对列表进行过滤、计数)。
- 类比:相当于 Vue 组件中的
computed(计算属性)。 - 作用:对 State 进行加工处理后返回,避免在多个组件中复制粘贴相同的逻辑。
- 特点:
- 缓存性:Getter 的返回值会根据它的依赖被缓存起来,只有当依赖值发生了改变才会被重新计算。
- 通过
this.$store.getters.xxx访问。
3. Mutation(状态变更)
- 定义:更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。
- 类比:类似于组件中的
methods(但仅限于同步操作),或者更像是一种“事件”。 - 作用:直接修改 State 数据。
- 特点:
- 必须是同步函数。这是为了确保状态变更可追踪(DevTools 需要捕捉快照)。
- 调用方式:
this.$store.commit('mutationName', payload)。
4. Action(动作)
- 定义:Action 类似于 Mutation,但它用于处理异步操作和业务逻辑。
- 类比:相当于组件中的
methods(可以包含异步操作)。 - 作用:
- 提交 Mutation(它不直接变更状态)。
- 包含任意异步操作(如 API 请求、定时器)。
- 特点:
- 可以是异步的。
- 调用方式:
this.$store.dispatch('actionName', payload)。
5. Module(模块)
- 定义:由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。Vuex 允许我们将 store 分割成模块(module)。
- 作用:代码组织和拆分。
- 特点:
- 每个模块拥有自己的 state、mutation、action、getter,甚至是嵌套子模块。
- 通常配合
namespaced: true(命名空间)使用,以避免命名冲突并提高封装性。
总结与数据流向图
Vuex 的数据流向是单向的,流程如下:
- Component (组件):触发(Dispatch)一个 Action。
- Action:执行异步操作(如请求后端 API),拿到数据后,提交(Commit)一个 Mutation。
- Mutation:同步修改 State。
- State:数据发生变化,响应式地更新 Component 的视图(或者通过 Getter 计算后更新)。
简单对比表:
| 属性 | 对应 Vue 概念 | 核心职责 | 同步/异步 | 调用方式 |
|---|---|---|---|---|
| State | data |
存储数据 | - | state.xxx |
| Getter | computed |
计算/过滤数据 | - | getters.xxx |
| Mutation | methods |
修改数据 | 必须同步 | commit() |
| Action | methods |
业务逻辑/API | 可以异步 | dispatch() |
| Module | - | 代码分割 | - | - |