作用:异步操作写在actions中,自身无法修改state中的数据,只能提交方法给mutations,通过mutations修改state中的数据
- 需要通过dispatch提交异步
- actions中接收异步,内部有一个参数context相当于store,可以通过提交同步
- mutations中接收同步,在对state中的数据进行修改
state: {
count: 0,
coderyg: {
name: 'coderyg',
age: 25,
height: 1.93
},
info: 'swk'
}
实例1:普通用法(需求:3s后修改info为zbj)
<p>{{ $store.state.info }}</p>
<button @click="update">3s后修改info</button>
update() {
this.$store.dispatch('aUpdate');
}
actions: {
aUpdate(context) {
setTimeout(() => {
context.commit('mUpdate');
}, 3000)
}
},
mutations: {
mUpdate(state) {
state.info = 'zbj'
}
}
实例2.1:直接提交一个大对象携带数据
<p>{{ $store.state.info }}</p>
<button @click="update('zbj')">3s后修改info</button>
update(info) {
this.$store.dispatch(这里开始{
type: 'aUpdate',
info
}这里结束是payload);
}
actions: {
aUpdate(context, payload) {
setTimeout(() => {
context.commit('mUpdate', payload);
console.log(payload);
}, 3000)
}
}
mutations: {
mUpdate(state, payload) {
state.info = payload.info;
}
}
实例2.2普通提交后面携带多个参数
update() {
this.$store.dispatch('aUpdate', 从这开始{
message: 'hello vuejs',
success: () => {
console.log('提交成功');
}
}到这结束是payload)
}
actions: {
aUpdate(context, payload) {
setTimeout(() => {
context.commit('mUpdate', payload);
}, 3000)
}
},
mutations: {
mUpdate(state, payload) {
state.info = payload.message;
payload.success();
}
}
实例2.3通过Promise优雅提交,使用dispatch提交异步时,接收异步请求使用Promise,当在Promise内部调用resolve()方法,则可以在dispatch后跟上then()方法
update() {
this.$store
.dispatch('aUpdate', 从这开始{
message: 'hello vuejs',
success: () => {
console.log('success');
}
}到这结束是payload)
.then(res => console.log(res))
}
actions: {
aUpdate(context, payload) {
return new Promise((resolve, reject) => {
setTimeout(() => {
context.commit('mUpdate', payload);
payload.success();
resolve('res');
}, 3000)
});
}
},
mutations: {
mUpdate(state, payload) {
state.info = payload.message;
}
}