博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Vuex系列] - Actions的理解之我见
阅读量:6881 次
发布时间:2019-06-27

本文共 2551 字,大约阅读时间需要 8 分钟。

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,内容如下:

复制代码

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,内容如下:

复制代码

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

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

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

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

在组件中使用mapActions 辅助函数

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

复制代码

组合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() 返回的是 Promiseactions: {  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 可以包含任意异步操作。

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

你可能感兴趣的文章
52.本地VMware环境虚拟机的异地(Azure)容灾(下)
查看>>
也谈谈Apache与Nginx
查看>>
Word中使用正则表达式进行查找和替换
查看>>
jquery.autocomplete 搜索文字提示
查看>>
ADB用法
查看>>
Remote Desktop Organizer – 管理组织远程桌面 - 小众软件
查看>>
把图片保存到数据库里
查看>>
【CUDA学习】全局存储器
查看>>
Reward HDU
查看>>
ISSkin 使用技巧,WinXP 下的窗口阴影
查看>>
HttpClient传递Cookie
查看>>
网站可用性测试及优化指南-随笔2
查看>>
Hammer.js
查看>>
WebService学习总结(四)——调用第三方提供的webService服务
查看>>
Selenium学习笔记之外部化相关测试数据---xml
查看>>
基于HTML5 Canvas实现的图片马赛克模糊特效
查看>>
原: 安装VMtools过程流水帐
查看>>
NYOJ1026 阶乘末尾非0 【模板】
查看>>
设计模式入门之装饰器模式Decorator
查看>>
aSmack连接server异常smack.SmackException$ ConnectionException thrown by XMPPConnection.connect();...
查看>>