[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系列] - Actions的理解之我见的更多相关文章
- vue学习笔记(六)— 关于Vuex可以这样简单理解
关于Vuex可以这样简单理解 作者:狐狸家的鱼 本文链接:关于Vuex GitHub:sueRimn 概念理解 和大多数文章都一样,从概念解释到引出问题再举例解决问题. 官网中,Vuex是状态管理模式 ...
- c#基础系列3---深入理解ref 和out
"大菜":源于自己刚踏入猿途混沌时起,自我感觉不是一般的菜,因而得名"大菜",于自身共勉. 扩展阅读 c#基础系列1---深入理解 值类型和引用类型 c#基础系 ...
- 智能合约语言 Solidity 教程系列10 - 完全理解函数修改器
这是Solidity教程系列文章第10篇,带大家完全理解Solidity的函数修改器. Solidity系列完整的文章列表请查看分类-Solidity. 写在前面 Solidity 是以太坊智能合约编 ...
- .Net Discovery 系列之七--深入理解.Net垃圾收集机制(拾贝篇)
关于.Net垃圾收集器(Garbage Collection),Aicken已经在“.Net Discovery 系列”文章中有2篇的涉及,这一篇文章是对上2篇文章的补充,关于“.Net Discov ...
- 详解Vuex常见问题、深入理解Vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态?我把它理解为在data中的属性需要共 ...
- vuex相关(actions和mutation的异曲同工)
vuex说明: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 包含的内容: state: ...
- 挑战全网最幽默的Vuex系列教程:第一讲 Vuex到底是什么鬼
先说两句 官方已经有教程了,为什么还要写这个教程呢?说实话,还真不是我闲着蛋疼,官方的教程真的是太官方了,对于刚入门 Vuex 的童鞋来说,想必看官方的教程,很多地方就如同看圣经一样,比如「欧玛尼玛尼 ...
- 挑战全网最幽默的Vuex系列教程:第六讲 Vuex的管理员Module(实战篇)
写在前面 这一讲是 Vuex 基础篇的最后一讲,也是最为复杂的一讲.如果按照官方来的话,对于新手可能有点难以接受,所以想了下,决定干脆多花点时间,用一个简单的例子来讲解,顺便也复习一下之前的知识点. ...
- 深入理解定时器系列第一篇——理解setTimeout和setInterval
× 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...
随机推荐
- windows下打开binlog
上篇我们介绍了binlog(参见mysql的binlog),配置文件用的是linux下的my.cnf,那么在windows下如何打开binlog呢?道理是相同的,配置文件是不一样的.在windows下 ...
- python常见面试集合
Python面试题目一.Python1. python的多进程与多线程的运行机制是什么?有什么区别?分别在什么情况下用?2. Python的装饰器的原理是什么,在什么情况会用到装饰器.请手写Pytho ...
- 修改root密码
Linux 密码的修改,使用passwd 命令修改 命令如下图:sudo passwd root 即可修改成功
- shell数组编程
.数组定义 [chengmo@centos5 ~]$ a=( ) [chengmo@centos5 ~]$ echo $a 一对括号表示是数组,数组元素用“空格”符号分割开. .数组读取与赋值 得到长 ...
- sql server 全角与半角字符转换
/****** SQL转换全角/半角函数 开始******/CREATE FUNCTION ConvertWordAngle ( @str NVARCHAR(4000), --要转换的字符串 @f ...
- VS2010开发.cpp与.c的注意事项
VS2010开发.cpp与.c的注意事项 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 强大的VS2010,正是由于vs2010的完全封装,让现在的wind ...
- SQL查询当天、本周、本月记录详解
--查询当天: select * from info where DateDiff(dd,datetime,getdate())=0 --查询24小时内的: select * from info wh ...
- 按css查询多个元素
示例2 查询多个元素 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!DOC ...
- Spring 使用复选选按钮
模型层需要提供数据选项,设置错误信息 关键代码 @NotNull @Size(min = 1, max = 5, message = "选择课程") private String[ ...
- kubespray部署k8s
0.把外网的/usr/local/bin/*拷过来覆盖 1.把部署好的集群的 calicoctl cni-plugins-linux-amd64-v0.8.1.tgz kubeadm-v1.16.3- ...