一、为什么需要Action?Mutation的“甩锅”故事
在Vuex的世界里,State是仓库的数据,Mutation是唯一能修改数据的“会计”——但这位会计有个怪癖:只接急单,不处理慢活。什么意思?Mutation必须是同步函数,因为Vuex要确保每次状态变化都能被DevTools准确追踪。如果你在Mutation里写一个异步操作,比如用setTimeout延迟修改数据,DevTools会直接“懵逼”:记录的时间线乱成一团,根本不知道状态在哪一刻变了。
举个生活例子:你点外卖时,如果让厨师同时负责炒菜和送餐,万一路上堵车,厨师就得在厨房干等,整个餐厅都瘫痪了。同理,如果在Mutation里调接口,页面会卡住直到响应返回——用户体验堪比等外卖等到饿晕。
这时,Action闪亮登场!它是Mutation的“黄金搭档”,专门处理异步操作。Action负责跑腿干活(比如调API、定时任务),干完后再通知Mutation:“哥们,数据拿到了,你快去更新!” 这样一来,Mutation继续当它的“快枪手”,State管理清晰可控。
简单总结:
- Mutation:同步修改State,类似餐厅厨师。
- Action:异步操作+提交Mutation,类似外卖骑手。
二、Action对象详解:配置、参数和“神操作”
1. Action的基本结构
在Vuex的store中,Action是一个对象,每个Action是一个函数。它接收两个参数:
context:模拟的store实例,包含commit、dispatch、state等方法。payload:可选参数,调用Action时传递的数据。
// store/index.js
const store = new Vuex.Store({
state: {
count: 0,
user: null
},
mutations: {
UPDATE_COUNT(state, value) {
state.count = value;
},
SET_USER(state, user) {
state.user = user;
}
},
actions: {
// 基本Action示例:延迟增加计数
asyncIncrement({ commit }, payload) {
setTimeout(() => {
commit('UPDATE_COUNT', payload.amount);
}, 1000);
},
// 异步获取用户信息
async fetchUser({ commit }, userId) {
const response = await api.getUser(userId); // 模拟API调用
commit('SET_USER', response.data);
}
}
});
2. Action的“超能力”:支持异步任意玩
Action内部可以用任何异步方式:
setTimeout/setIntervalPromise或async/await- 甚至调用其他Action!

最低0.47元/天 解锁文章
6166

被折叠的 条评论
为什么被折叠?



