[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


相关推荐

  • shell编程if/then备忘

    shell编程if/then备忘一、基础知识”[“是专有命令,而不是普通测试符号(ls/usr/bin/[有结果),和test命令等价,并且是内建命令。bash2.02引入[[…]]扩展测试命令,但是[[是一个关键字,而不是一个命令,Bash把[[$a-lt$b]]看做一个单独的元素,并且返回一个退出状态码((…))和let…结构也能够返回退出状态吗,当他们所测试的算术表达式的结构

    2022年8月18日
    12
  • 体系结构 | 五段流水线 | 流水线技术

    体系结构 | 五段流水线 | 流水线技术一条经典的 5 段流水线 一条指令的执行过程分为以下 5 个周期 取指令周期 IF 指令译码 读寄存器周期 ID 执行 有效地址计算周期 EX 存储器访问 分支完成周期 MEM 写回周期 WB 一条经典的 5 段流水线介绍一条经典的 5 段 RISC 流水线每一个周期作为一个流水段 在各段之间加上锁存器 流水寄存器 一条指令的执行过程分为以下 5 个周期 取指令周期 IF 以程序计数器 PC 中的内容作为地址 从存储器中取出指令并放入指令寄存器 IR 同时 PC 值加 4

    2026年3月18日
    2
  • AngularJS进阶(二)AngularJS路由问题解决

    AngularJS进阶(二)AngularJS路由问题解决AngularJS路由问题解决遇到了一个棘手的问题:点击优惠详情时总是跳转到药店详情页面中去。再加一层地址解决了,但是后来发现问题还是来了:Couldnotresolve’yhDtlMaintain/yhdetail’fromstate’yhMaintain’药店详情http://192.168.1.118:8088/lmapp/index.html#/0优惠券详情

    2022年7月25日
    12
  • 树莓派3B安装Ubuntu 18.04

    树莓派3B安装Ubuntu 18.04树莓派3B安装Ubuntu18.04这里展示的是使用显示器的方法,不用ssh树莓派3b安装Ubuntu18.04完全遵照的Ubuntuwiki中的步骤。(1)下载并写入下载Ubuntu18.04LTS镜像文件:https://wiki.ubuntu.com/ARM/RaspberryPi,下载完后解压:ubuntu-18.04-preinstalled-server-armhf+…

    2022年6月25日
    55
  • 社区打造智慧小区_idc智能化解决方案

    社区打造智慧小区_idc智能化解决方案智慧社区建设方案丨智慧小区智能化解决方案随着物联网技术和我国新一代互联网技术的发展,未来社区网络将会实现全覆盖,通过社区网络和物联网络,将会实现社区机电设备和住宅的自动化,智能化,实现远程监控和网络数字化。智慧社区是社区综合服务管理的一种创新,利用前沿的智能化基础设施建设,增强社区治理和小区管理智能化,推动便民措施服务项目智能化,使社区居民的衣食住行更为舒服、高效率。智慧社区概念介绍:智慧社区是指充分利用物联网、云计算、移动互联网等新一代信息技术的集成应用,涉及到智能楼…

    2022年10月18日
    7
  • java11-泛型及其使用[通俗易懂]

    java11-泛型及其使用[通俗易懂]1.概述就本质而言“泛型”的意思就是参数化类型。参数化类型很重要,因为使用该特性创建的类、接口以及方法可以以参数的形式指定操作的数据类型。泛型通俗的说就是方法的返回值或参数是不确定的,可以随创建

    2022年8月4日
    14

发表回复

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

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