恕小端不才,对Action的总结以下:vue
接下来咱们经过上面三点总结来看Actions的使用:vuex
咱们先在actions.js定义一个addCountAction方法用来作累加器bash
const actions = {
addNumAction (context, num) {
context.commit('addNum', num)
},
addCountAction (context) {
context.commit('add')
}
}
export default actions
复制代码
在组件中经过.dispatch进行分发Actions,内容以下:异步
<template>
<div class="action">
<p>{{ count }}</p>
<button @click="add">+ADD</button>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
data () {
return {}
},
computed: {
...mapState(['count'])
},
methods: {
add () {
this.$store.dispatch('addCountAction')
}
}
}
</script>
复制代码
在actions.js中定义一个新方法reduceCountAction方法,实现一个累减async
const actions = {
addNumAction (context, num) {
context.commit('addNum', num)
},
addCountAction (context) {
context.commit('add')
},
reduceCountAction (context) {
context.state.count--
}
}
export default actions
复制代码
在组件中经过.dispatch进行分发Actions,内容以下:函数
<template>
<div class="action">
<button @click="reduce">-REDUCE</button>
<p>{{ count }}</p>
<button @click="add">+ADD</button>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
data () {
return {}
},
computed: {
...mapState(['count'])
},
methods: {
add () {
this.$store.dispatch('addCountAction')
},
reduce () {
this.$store.dispatch('reduceCountAction')
}
}
}
</script>
复制代码
咱们将actions.js中的addCountAction函数修改以下:post
addCountAction (context) {
setTimeout(function () {
context.commit('add')
}, 2000)
}
复制代码
修改后咱们发如今执行累加的时候,会等待两秒才会执行。ui
将以前的组件addCountAction函数用辅助函数替代,修改以下:this
<template>
<div class="action">
<button @click="reduce">-REDUCE</button>
<p>{{ count }}</p>
<button @click="addCountAction">+ADD</button>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex'
export default {
data () {
return {}
},
computed: {
...mapState(['count'])
},
methods: {
...mapActions(['addCountAction']),
reduce () {
this.$store.dispatch('reduceCountAction')
}
}
}
</script>
复制代码
Action一般是异步的,那么如何知道action何时结束呢?更重要的是,咱们如何才能组合多个action,以处理更加复杂的异步流程?spa
首先,你须要明白 store.dispatch 能够处理被触发的 action 的处理函数返回的 Promise,而且 store.dispatch 仍旧返回 Promise:
const actions = {
addNumAction (context, num) {
context.commit('addNum', num)
},
addCountAction (context) {
return new Promise((resolve, reject) => {
setTimeout(() => {
context.commit('add')
resolve()
}, 1000)
})
},
reduceCountAction (context) {
context.state.count--
},
addTwoAction (context) {
context.dispatch('addCountAction').then(() => {
context.commit('addTwo')
})
}
}
export default actions
复制代码
在上面咱们在addTwoAction函数中实现了一个组合的actions
// 假设 getData() 和 getOtherData() 返回的是 Promise
actions: {
async actionA ({ commit }) {
commit('gotData', await getData())
},
async actionB ({ dispatch, commit }) {
await dispatch('actionA') // 等待 actionA 完成
commit('gotOtherData', await getOtherData())
}
}
复制代码
一个store.dispatch在不一样模块中能够触发多个action函数。在这种状况下,只有当全部触发函数完成后,返回的Promise才会执行。
最后,咱们说下官方的定义,在官网是这样定义的Actions: