简介

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,而不是直接变更状态。
  • Action 可以包含任意异步操作。

说白就是通过间接的方式解决啦mutation不能异步的缺陷

注册Vue-Action

让我们来注册一个简单的 action:

  1. const store = new Vuex.Store({
  2. state: {
  3. count: 0
  4. },
  5. mutations: {
  6. increment (state) {
  7. state.count++
  8. }
  9. },
  10. actions: {
  11. increment (context) {
  12. context.commit('increment')
  13. }
  14. }
  15. })

参数context的解释

来自vueX的官方解释为:
image.png

使用结构参数的形式提交一个Mutation

  1. actions: {
  2. increment ({ commit }) {
  3. commit('increment')
  4. }
  5. }

分发Action//如何使用

  1. store.dispatch('increment')

传递参数

  1. // 以载荷形式分发
  2. store.dispatch('incrementAsync', {
  3. amount: 10
  4. })
  5. // 以对象形式分发
  6. store.dispatch({
  7. type: 'incrementAsync',
  8. amount: 10
  9. })

辅助函数mapActions的使用

  1. import { mapActions } from 'vuex'
  2. export default {
  3. // ...
  4. methods: {
  5. ...mapActions([
  6. 'increment', // 将 `this.increment()` 映射为 `this.$store.dispatch('increment')`
  7. // `mapActions` 也支持载荷:
  8. 'incrementBy' // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch('incrementBy', amount)`
  9. ]),
  10. ...mapActions({
  11. add: 'increment' // 将 `this.add()` 映射为 `this.$store.dispatch('increment')`
  12. })
  13. }
  14. handleClick(){
  15. this.increment()
  16. this.incrementBy(amout)
  17. this.add()
  18. }
  19. }

Action实现异步Mountain

  1. actions: {
  2. incrementAsync ({ commit }) {
  3. setTimeout(() => {
  4. commit('increment')
  5. }, 1000)
  6. }
  7. }

组合Action

Action 通常是异步的,那么如何知道 action 什么时候结束呢?更重要的是,我们如何才能组合多个 action,以处理更加复杂的异步流程?
首先,你需要明白 store.dispatch 可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise:

  1. actions: {
  2. actionA ({ commit }) {
  3. return new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. commit('someMutation')
  6. resolve()
  7. }, 1000)
  8. })
  9. }
  10. }

现在你可以:

  1. store.dispatch('actionA').then(() => {
  2. // ...
  3. })

Vuex管理模式//Action 的工作的示意图

image.png