作用:在actions中提交mutation,并且可以包含任何的异步操作。actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据(但是还是通过mutation来操作,因为只有它能操作)
二.操作
1.定义action --->发布$store.dispatch("SOME_INCREMENT")
//1.vueDome.vue $store.dispatch()发布
测试1:Count is {{count}}
//2.store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 引入actions, mutations, getters
import actions from "./actions.js"
import mutations from "./mutations.js"
import getters from "./getters.js"
const state = {
// 应用启动时, count置为0
count:0
}
export default new Vuex.Store({
//创建一个对象来保存应用启动时的初始状态
state,
getters,
actions,
mutations
})
//3.mutations.js
import { SOME_INCREMENT } from './mutation-types'
import { SOME_DECREMENT } from './mutation-types'
export default {
//使用ES6的箭头函数来给count增值
SOME_INCREMENT(state,n){
state.count +=n.a;
},
SOME_DECREMENT:state => state.count --,
}
//3.actions.js
export default {
SOME_INCREMENT(context){
context.commit('SOME_INCREMENT',{a:10}) //可以理解为代表了整个的context
},
SOME_DECREMENT({commit}){
commit('SOME_DECREMENT');
}
}
mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在根节点注入 store):
import { mapActions } from 'vuex'
export default {
methods:{
...mapActions([
'SOME_INCREMENT',
'SOME_DECREMENT'
])
}
}
三.异步操作
action 内部执行异步操作:
SOME_INCREMENT(context,m){
setTimeout(() => {
context.commit({
type: "SOME_INCREMENT",
amout: m.amout
})
}, 1000)
},
demo:
//1.vueDome.vue $store.dispatch()发布
测试1:Count is {{count}}
//2.store.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 引入actions, mutations, getters
import actions from "./actions.js"
import mutations from "./mutations.js"
import getters from "./getters.js"
const state = {
// 应用启动时, count置为0
count:0
}
export default new Vuex.Store({
//创建一个对象来保存应用启动时的初始状态
state,
getters,
actions,
mutations
})
//3.mutations.js
import { SOME_INCREMENT } from './mutation-types'
import { SOME_DECREMENT } from './mutation-types'
export default {
//使用ES6的箭头函数来给count增值
SOME_INCREMENT(state,n){
state.count += n.amout;
},
SOME_DECREMENT:state => state.count --,
}
//3.actions.js
export default {
SOME_INCREMENT(context,m){
setTimeout(() => {
context.commit({
type: "SOME_INCREMENT",
amout: m.amout
})
}, 1000)
},
SOME_DECREMENT({commit}){
commit('SOME_DECREMENT');
}
}
最后我们利用JS新特性,async/await组合action
//假设getData(),getOtherData()返回的是Promise
actions:{
//async 表示这是一个async函数,await只能用在这个函数里面。
async actionA({commit}){
commit('gotData',swait getData())
},
async actionA({commit}){
//等待action完成,await 后面跟着的应该是一个promise对象
await dispatch('actionA')
commit('gotOtherData',await getOeherData())
}
}
一个store.dispatch在不同模块中可以触发多个action函数。在这种情况下,只有当所有触发函数完成后,返回的Promise才会执行;