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 相关文章推荐
javascript 函数调用的对象和方法
Jul 01 Javascript
jQuery关于导航条背景切换效果实现示例
Sep 04 Javascript
Jquery获得控件值的三种方法总结
Feb 13 Javascript
实例讲解jQuery EasyUI tree中state属性慎用
Apr 01 Javascript
Javascript中的arguments对象
Jun 20 Javascript
jquery popupDialog 使用 加载jsp页面的方法
Oct 25 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
详解vue移动端日期选择组件
Feb 22 Javascript
vue.js element-ui tree树形控件改iview的方法
Mar 29 Javascript
关于JavaScript中高阶函数的魅力详解
Sep 07 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
May 05 Javascript
浅谈vue 多个变量同时赋相同值互相影响
Aug 05 Javascript
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
shell脚本作为保证PHP脚本不挂掉的守护进程实例分享
2013/07/15 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
2016/04/20 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
laravel 解决多库下的DB::transaction()事务失效问题
2019/10/21 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
IE和firefox浏览器的event事件兼容性汇总
2009/12/06 Javascript
range 标准化之获取
2011/08/28 Javascript
不用构造函数(Constructor)new关键字也能实现JavaScript的面向对象
2013/01/11 Javascript
jQuery实现下拉框左右选择的简单实例
2014/02/22 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
jquery UI Datepicker时间控件的使用方法(终结版)
2015/11/07 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
json与jsonp知识小结(推荐)
2016/08/16 Javascript
初探nodeJS
2017/01/24 NodeJs
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
js实现简单掷骰子小游戏
2019/10/24 Javascript
vue中渲染对象中属性时显示未定义的解决
2020/07/31 Javascript
js+css3实现简单时钟特效
2020/09/13 Javascript
[01:21:58]守擂赛DOTA2第一周决赛
2020/04/22 DOTA
python基于itchat模块实现微信防撤回
2019/04/29 Python
使用Keras建立模型并训练等一系列操作方式
2020/07/02 Python
Python extract及contains方法代码实例
2020/09/11 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
接口可以包含哪些成员
2012/09/30 面试题
赔偿协议书范本
2014/04/15 职场文书
党员干部民主生活会议批评与自我批评材料
2014/09/20 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
安全承诺书
2015/01/19 职场文书
会计做账心得体会
2016/01/22 职场文书