Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。在 Vuex 中,mutations
是用来改变状态的唯一途径,它们是同步事务。
Mutation 的特性:
-
同步操作:Mutation 必须是同步函数。这意味着它不应该包含异步操作,如 API 调用。这是为了确保状态的变化可以被跟踪和调试,同时也便于使用 Vue 的 devtools 进行时间旅行调试。
-
改变状态:Mutation 直接修改
state
,并且必须显式地定义每个改变状态的方法。这样可以明确地记录每一个状态变更的原因,使得应用的状态变更可追踪。 -
事件驱动:可以通过提交(
commit
)一个类型(通常是一个字符串)来触发一个 mutation。这允许我们分发并在组件中触发状态变更,同时保持清晰的数据流。 -
严格模式:Vuex 提供了一个可选的“严格模式”,如果启用,任何不在 mutation 中进行的状态变更都会抛出错误。这有助于在开发过程中发现不当修改状态的尝试。
-
记录状态变更:由于 Mutation 是直接修改状态的,因此它们是 Vuex DevTools 能够记录和展示状态变更历史的基础,这对于调试非常有帮助。
示例代码:
// store.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 0
},
mutations: {
// 增加计数器
increment(state) {
state.count++;
},
// 减少计数器
decrement(state) {
state.count--;
},
// 通过参数改变计数器
setCount(state, value) {
state.count = value;
}
},
actions: {}, // 动作,用于处理异步逻辑
getters: {} // 计算属性,用于派生状态
});
// 在组件中提交 mutation
this.$store.commit('increment');
在这个例子中,increment
、decrement
和 setCount
是三个 mutation,分别用于增加、减少和直接设置计数器的值。组件通过 $store.commit
方法来触发这些 mutation,进而改变全局状态。