vuex actions异步修改状态的实例详解
作者:周行知 发布时间:2024-05-10 14:12:50
actions异步修改状态与mutations同步修改状态是两个容易混淆的概念,因为两者在执行上,很难测试出两者的差别,而我们要区别它们两,首先你得区分同步与异步,我的理解是,同步更像是一条流水线作业,而异步则更像是多条,例子你比如打电话,我们通常是我打给我妈,打完之后,再跟我爸打,而异步更像是某聊天工具,你既可以跟你爸聊,又可以跟你妈聊,你跟你妈聊可以在你爸的后面,也可以在他前面,你爸也是
而actions与mutations的区别就在此,mutations是你进行用百度钱包买一件商品时,你必须先把东西购买流程走完你才能再购买另一件商品而actions是你完全可以一样在准备结算时,你可以选择其他商品,结算完其他商品再进行商品的结算,也可以一起结算。
下面我具体介绍actions写法
第一步 在你建立vuex的store.js中声明actions方法
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state={//状态对象
count1:1,
},
const mutations={//触发状态
jia(state,n){
state.count1+=n;
},
jian(state){
state.count1--;
},
},
const actions={
jiaAction(context){
context.commit('jia',10)
/*这句话就是说,我现在store调用了同步的方法jia()*/
},
jianAction({commit}){
commit('jian')/*这句话就是说,我现在store调用了同步的方法jian()*/
}
}
export default new Vuex.Store({
state,
mutations,
getters,
actions/*这与state,mutations的操作方法是相同*/
})
第二步 在你的模板(比如a.vue)里引入你需要actions方法
1)import引入mapActions
import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'
2)在你的方法中引入 ...mapActions(['jiaAction','jianAction'])
格式一般都是固定照抄即可
代码如下:
<template>
<div>
<div>
{{count1}}
</div>
</div>
</template>
<script>
import store from '@/store'
import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'
export default{
data(){
return{
}
},
methods:{
...mapMutations([
'jia','jian'
]),
...mapActions(['jiaAction','jianAction'])
},
computed:{
...mapState(["count1"]),
},
store
}
</script>
<style scoped>
.color{
color:red;
}
</style>
第三步在你的组件的模板(a.vue)里引入点击事件
代码如下:
<template>
<div>
<div>
{{count1}}
</div>
<p>
<button @click="jiaAction">+</button>
<button @click="jianAction">-</button>
</p>
</div>
</template>
整体代码如下:
<template>
<div>
<div>
{{count1}}
</div>
<p>
<button @click="jiaAction">+</button>
<button @click="jianAction">-</button>
</p>
</div>
</template>
<script>
import store from '@/store'
import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'
export default{
data(){
return{
}
},
methods:{
...mapMutations([
'jia','jian'
]),
...mapActions(['jiaAction','jianAction'])
},
computed:{
...mapState(["count1"]),
},
store
}
</script>
注:现在你点击你的+或-的按钮,观察它的值与你把
<button @click="jiaAction">+</button>
<button @click="jianAction">-</button>
换成
<button @click="jia">+</button>
<button @click="jian">-</button>
有何不同?
没有区别说明你调试代码成功
第四步 进行异步验证
我们在我们的store.js中的jiaAction加入jiaAction方法
setTimeout(()=>{
context.commit('jian')
},3000)
console.log('我先被执行');
你再观察结果,你会发现jian这个方法在3s之后执行,你点jia依然可以在3s之内先执行,这就是异步修改状态与同步的区别。
整体代码如下:
a.vue部分
<template>
<div>
<div>
{{count1}}
</div>
<p>
<button @click="jiaAction">+</button>
<button @click="jianAction">-</button>
</p>
</div>
</template>
整体代码如下:
<template>
<div>
<div>
{{count1}}
</div>
<p>
<button @click="jiaAction">+</button>
<button @click="jianAction">-</button>
</p>
</div>
</template>
<script>
import store from '@/store'
import {mapState,mapMutations,mapGetters,mapActions} from 'vuex'
export default{
data(){
return{
}
},
methods:{
...mapMutations([
'jia','jian'
]),
...mapActions(['jiaAction','jianAction'])
},
computed:{
...mapState(["count1"]),
},
store
}
</script>
store.js部分
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const state={//状态对象
count1:1,
},
const mutations={//触发状态
jia(state,n){
state.count1+=n;
},
jian(state){
state.count1--;
},
},
const actions={
jiaAction(context){
setTimeout(()=>{
context.commit('jian')
},3000)
console.log('我先被执行');
context.commit('jia',10)
/*这句话就是说,我现在store调用了同步的方法jia()*/
},
jianAction({commit}){
commit('jian')/*这句话就是说,我现在store调用了同步的方法jian()*/
}
}
export default new Vuex.Store({
state,
mutations,
getters,
actions/*这与state,mutations的操作方法是相同*/
})
来源:https://blog.csdn.net/baidu_36681154/article/details/79208463


猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~#zmail库:可以用几行代码帮我们收取一封邮件import zmail#输入账号和密码server
- 先来看javascript的直接写在了input上 <input name="pwuser" type="
- 本文实例讲述了python获取指定目录下所有文件名列表的方法。分享给大家供大家参考。具体实现方法如下:这里python代码实现获取文件名列表
- 由于改代码因为这个问题卡了半个小时特此记录首先对于一个单层的列表赋值如下,可以看见,如果直接使用 = 的话。其中一个变换便会引起另外一个变换
- EXPLAIN 是 MySQL 提供的一种工具,用于分析查询语句的执行计划,即查询优化器是如何决定执行查询语句的。EXPLAIN可以帮助我们
- 因为项目开发中遇到需要向后台传本周的开始和结束时间,以及上一周的起止时间,就琢磨了半天,总算写出来一套,写篇文章是为了方便自己记忆,也是分享
- 一、概念二维列表的元素还是列表(列表的嵌套),称之为二维列表。需要通过行标和列标来访问二维列表的元素二、创建二维列表1、追加一维列标来生成二
- 昨天又翻了下前段时间WD内部培训的幻灯片,发现了kejun推荐的一篇好文:Javascript Closures,看了之后受益匪浅。这篇文章
- 指定变量类型有时您可能需要为变量指定类型,这可以通过 casting 来完成,Python 是一门面向对象的语言,因此它使用类来定义数据类型
- 代码的作用在于保证在上端缓存服务失效(一般来说概率比较低)时,形成倒瓶颈,从而能够保护数据库,数据库宕了,才是大问题(比如影响其他应用)。假
- <?php /******************************************** *&nb
- 使用pandas下的cumsum函数cumsum:计算轴向元素累积加和,返回由中间结果组成的数组.重点就是返回值是"由中间结果组成
- 1. XML简介XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许
- 本文实例讲述了Python实现批量读取图片并存入mongodb数据库的方法。分享给大家供大家参考,具体如下:我的图片放在E:\image\中
- 根据我们指定的条件检索函数中的元素import matplotlib.pyplot as pltimport numpy as npa =
- 本文实例讲述了js表格排序的方法。分享给大家供大家参考。具体如下:<html><head><title>
- 首先,我要在这里写上一些很官方的概念,意在说明面向对象是很具体化的,很实体的模式,不能让有些人看见“对象&rdq
- 1.1 闭包1、闭包概念1. 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用,这样就构成了
- 多线程到底什么是多线程?说起多线程我们首先从单线程来说。例如,我在这里看书,等这件事情干完,我就再去听音乐。对于这两件事情来说都是属于单线程
- 1、异常的传播当在函数中出现异常时,如果在函数中对异常进行了处理,则异常不会再继续传播。如果函数中没有对异常进行处理,则异常会继续向函数调用