Vue核心概念Action的总结


Posted in Javascript onJanuary 18, 2019

Action 类似于mutation,不同在于:

- Action 提交的是mutation,而不是直接变更状态。

- Action 可以包含任意异步操作。

Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。当我们在之后介绍到 Modules 时,你就知道 context 对象为什么不是 store 实例本身了。

代码实例

store.js

actions: {
    // 商品半价
    disCount (content) {
      // actions中通过commit()提交mutations中的goodsPriceHalve()函数
      content.commit('goodsPriceHalve')
    },
    // 异步的商品半价
    /**
     * disCountAsync ({commit}){
      setTimeout(() => {
        commit('goodsPriceHalve')
      },1000)
    } */
    disCountAsync ({commit}){
      setTimeout(() => {
        commit('goodsPriceHalve')
      },1000)
    },
    // 统一修改商品名字
    /* acyionChangeName()的第一个参数可以理解成是一个对象,第二个参数为事件传递过来的参数
    这个参数也需要传递给mutations中相对应的函数中*/
    acyionChangeName(content,payload){
      // 载荷形式
      content.commit('changeName',payload);
    },
    acyionChangeNameAsync (content,payload){
      setTimeout(() => {
        // 对象形式
        content.commit('changeName',payload.payload)
      },1000)
    }
  }

这里有同步也有异步,有载荷也有没有载荷。

page7.vue

<template>
  <div>
    <h2>我是第五个页面</h2>
    <div>
      <input type="text" placeholder="请输入商品的新名字" v-model="inpValue">
      <button @click="disCountPrice()">同步商品价格减半</button>
      <button @click="disCountPriceAsync()">异步商品价格减半</button>
    </div>
    <ul class="ul_list">
      <li v-for="item in goodsListHalv">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">价格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
      inpValue:'',
    }
   },
   computed: {
     goodsListHalv(){
       return this.$store.state.goodsList;
     }
   },
   methods: {
    //  注意这里使用箭头函数可能会报错
    // 同步商品价格减半;触发事件提交actions中的disCount()函数
     disCountPrice: function(){
       this.$store.dispatch('disCount')
     },
     // 异步商品价格减半
     disCountPriceAsync: function(){
       this.$store.dispatch('disCountAsync')
     },
   }
  }
</script>

page8.vue

<template>
  <div>
    <h2>我是第六个页面</h2>
    <div>
      <input type="text" placeholder="请输入商品的新名字" v-model="inpValue">
      <button @click="acyionChangeName()">载荷修改商品的名字(字符串)</button>
      <button @click="acyionChangeNameAsync()">载荷修改商品的名字(对象)</button>
    </div>
    <ul class="ul_list">
      <li v-for="item in goodsListHalv" :key="item.id">
        <p class="name">商品:{{item.name}}</p>
        <p class="price">价格:¥{{item.price}}</p>
      </li>
    </ul>
  </div>
</template>
<script>
 export default {
   data() {
    return {
      inpValue:'',
    }
   },
   computed: {
     goodsListHalv(){
       return this.$store.state.goodsList;
     }
   },
   methods: {
    //  注意这里使用箭头函数可能会报错
    // 同步修改商品的名字;触发事件提交actions中的acyionChangeName()函数
     acyionChangeName: function(){
       this.$store.dispatch('acyionChangeName',this.inpValue)
     },
     // 异步修改商品的名字;对象 对象中包含两个属性type事件函数,payload参数
     acyionChangeNameAsync: function(){
       this.$store.dispatch({
         type:'acyionChangeNameAsync',
         payload:this.inpValue
       })
     },
   }
  }
</script>

乍一眼看上去感觉多此一举,我们直接分发 mutation 岂不更方便?实际上并非如此,还记得 mutation 必须同步执行这个限制么?Action 就不受约束!我们可以在 action 内部执行异步操作。

Actions 支持同样的载荷方式和对象方式进行分发。

效果图

Vue核心概念Action的总结

代码执行过程:

上面的Action执行过程是:按钮点击?>执行按钮点击事件方法?>执行$store.dispatch('avtions中的对应的函数名',参数)?>执行actions里面对应的方法?>执行mutations里面对应的方法?>修改state里面对应的数据?>页面渲染。

小结:

在Mutation中我们组件调用方法使用的是commit,在Action中组件使用的却是dispatch分发。看过vue1.x文档的,可能对commit和dispatch就有点感觉了,或者你看过socket。

这里主要要明白以下几点:

1.Mutation是同步的,Action是异步的;

2.Mutation是直接变更状态,Action提交的是mutation;

3.Actions和Mutation 都支持载荷方式和对象方式进行分发。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
JS实现动态生成表格并提交表格数据向后端
Nov 25 Javascript
JavaScript 函数的执行过程
May 09 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
微信小程序中使用ECharts 异步加载数据的方法
Jun 27 Javascript
浅析JS中什么是自定义react数据验证组件
Oct 19 Javascript
React和Vue中监听变量变化的方法
Nov 14 Javascript
Vue.js构建你的第一个包并在NPM上发布的方法步骤
May 01 Javascript
详解Vue项目引入CreateJS的方法(亲测可用)
May 30 Javascript
在Vue中用canvas实现二维码和图片合成海报的方法
Jun 10 Javascript
layui-tree实现Ajax异步请求后动态添加节点的方法
Sep 23 Javascript
JavaScript setInterval()与setTimeout()计时器
Dec 27 Javascript
jQuery加PHP实现图片上传并提交的示例代码
Jul 16 jQuery
js取小数点后两位四种方法
Jan 18 #Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 #jQuery
jquery获取file表单选择文件的路径、名字、大小、类型
Jan 18 #jQuery
jQuery实现适用于移动端的跑马灯抽奖特效示例
Jan 18 #jQuery
js数组去重的方法总结
Jan 18 #Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
Jan 18 #jQuery
highCharts提示框中显示当前时间的方法
Jan 18 #Javascript
You might like
php生成随机字符串可指定纯数字、纯字母或者混合的
2014/04/18 PHP
PHP简单实现“相关文章推荐”功能的方法
2014/07/19 PHP
php读取和保存base64编码的图片内容
2017/04/22 PHP
php时间戳转换代码详解
2019/08/04 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
使用prototype.js进行异步操作
2007/02/07 Javascript
js 判断 enter 事件
2009/02/12 Javascript
jQuery html() in Firefox (uses .innerHTML) ignores DOM changes
2010/03/05 Javascript
Dom操作之兼容技巧分享
2011/09/20 Javascript
js中判断数字\字母\中文的正则表达式 (实例)
2012/06/29 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
Bootstrap基本插件学习笔记之模态对话框(16)
2016/12/08 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
解决python写的windows服务不能启动的问题
2014/04/15 Python
zookeeper python接口实例详解
2018/01/18 Python
django自带调试服务器的使用详解
2019/08/29 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
python logging通过json文件配置的步骤
2020/04/27 Python
Python函数参数分类原理详解
2020/05/28 Python
Python在线和离线安装第三方库的方法
2020/10/31 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
办公室主任先进事迹
2014/01/18 职场文书
青年文明号口号
2014/06/17 职场文书
学校捐款活动总结
2015/05/09 职场文书
反邪教学习心得体会
2016/01/15 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
pytorch DataLoader的num_workers参数与设置大小详解
2021/05/28 Python