[Vuex系列] – Actions的理解之我见

[Vuex系列] – Actions的理解之我见

Actions如何定义的

恕小端不才,对Action的总结如下:

  • Action 可以提交mutation方法,通过mutation来改变state
  • Action 函数可以接收一个context对象,通过context.state 和 context.getters来改变state。(在实际工作中不常用)
  • Action 可以执行任意的同步和异步操作

接下来我们通过上面三点总结来看Actions的使用:

Action 可以提交mutation方法,通过mutation来改变state

我们先在actions.js定义一个addCountAction方法用来做累加器

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>
复制代码

Action 函数可以接收一个context对象,通过context.state 和 context.getters来改变state。(不推荐使用)

在actions.js中定义一个新方法reduceCountAction方法,实现一个累减

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>
复制代码

Action 可以执行任意的同步和异步操作

我们将actions.js中的addCountAction函数修改如下:

addCountAction (context) {
    setTimeout(function () {
      context.commit('add')
    }, 2000)
}
复制代码

修改后我们发现在执行累加的时候,会等待两秒才会执行。

在组件中使用mapActions 辅助函数

将之前的组件addCountAction函数用辅助函数替代,修改如下:

<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>

复制代码

组合Actions的使用

Action通常是异步的,那么如何知道action什么时候结束呢?更重要的是,我们如何才能组合多个action,以处理更加复杂的异步流程?

首先,你需要明白 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

  • 如果我们利用 async / await,我们可以如下组合 action
// 假设 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:

  • Action 类似于 mutation,不同在于:

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

一、[Vuex系列] – 初尝Vuex第一个例子

二、[Vuex系列] – 细说state的几种用法

三、[Vuex系列] – Mutation的具体用法

四、[Vuex系列] – getters的用法

五、[Vuex系列] – Actions的理解之我见

六、[Vuex系列] – Module的用法(终篇)

转载于:https://juejin.im/post/5cc5cd02f265da0368146629

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100947.html原文链接:https://javaforall.net

(0)
上一篇 2021年7月6日 上午9:00
下一篇 2021年7月6日 上午10:00


相关推荐

  • 数据结构(廿三) — C语言版 — 图 – 图的存储结构 — 邻接表、逆邻接表

    数据结构(廿三) — C语言版 — 图 – 图的存储结构 — 邻接表、逆邻接表在图中任何两个顶点之间都可能存在联系 所以图的存储结构应该需要根据具体问题的要求来进行设计 从图的逻辑结构定义来看 图中任何一个顶点都可以看成是第一个顶点 常用的存储结构有邻接矩阵 邻接表 逆邻接表 十字链表 邻接多重表 边集数组 那么本博文将带你就 邻接表 逆邻接表 来窥探一二

    2026年2月27日
    1
  • SP论坛天堂鸟技术学院[通俗易懂]

    SP论坛天堂鸟技术学院[通俗易懂]http://www.spzone.net/bbs/index.asp

    2022年6月29日
    38
  • Java cast_java concat方法

    Java cast_java concat方法在说ClassCastException之前,先介绍下引用类型转换;引用类型转换分为向上转型和向下转型两种;向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的;当父类引用指向一个子类对象时,便是向上转换;使用格式:父类类型变量名=new子类类型();向下转型:父类类型向子类类型向下转换的过程,这个过程时强制;一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强…

    2025年9月6日
    6
  • 引入Bootstrap方法

    引入Bootstrap方法如果你是一名 web 前端开发工程师或者网页设计师 那么肯定对 Bootstrap 这个框架早有耳闻 甚至一些 web 后端工程师也会常常借助 Bootstrap 的力量来构筑自己心目中理想的 web 应用 而在去年年底推出的 Bootstrap3 更是追随了响应式布局 扁平化设计的 web 开发与设计潮流 让我们感受到了它所带来的无穷魅力 我们会通过接下来一系列的 Bootstrap 教程 让 Bootstrap 初学者们

    2026年3月26日
    2
  • 快速阶乘算法python_【最全】阶乘算法!(python和C语言)

    快速阶乘算法python_【最全】阶乘算法!(python和C语言)阶乘的计算叁岁学编程:用最简单的大白话理解编程,欢迎大家关注,留言,提问,希望和大家一起提升!文章目录阶乘的计算阶乘定义:解析方法一:for循环计算方法二:定义for循环的函数计算方法三:定义递归函数计算小知识:C语言代码方法一:for函数方法二:递归函数总结:阶乘定义:阶乘指从1乘以2乘以3乘以4一直乘到所要求的数。例如所要求的数是4,则阶乘式是1×2×3×4,得到的积是24。24就是4的阶乘。…

    2022年7月24日
    12
  • 分布式链路追踪技术对比

    分布式链路追踪技术对比精品文章 sharding jdbc 源码分析 Eureka 源码解析 rocketMq 源码深度解析 xxl job 分布式定时任务构建 sleuth zipkin 全链路监控系统深入理解 dubbo 实现原理方案选择本文最终选择了 zipkin sleuth 做二次开发 这样做灵活性比较大一点 有兴趣的可以进我博客看一下 我会将我二次开发过程当中遇到的问题发出来 搭建环境 sleu

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号