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 相关文章推荐
基于JQuery框架的AJAX实例代码
Nov 03 Javascript
JS setCapture 区域外事件捕捉
Mar 18 Javascript
图片轮换效果实现代码(点击按钮停止执行)
Apr 12 Javascript
『jQuery』取指定url格式及分割函数应用
Apr 22 Javascript
火狐textarea输入法的bug的触发及解决
Jul 24 Javascript
jquery常用特效方法使用示例
Apr 25 Javascript
用javascript实现自动输出网页文本
Jul 30 Javascript
简单实现Bootstrap标签页
Aug 09 Javascript
jquery 校验中国身份证号码实例详解
Apr 11 jQuery
iview form清除校验状态的实现
Sep 19 Javascript
javascript简单实现深浅拷贝过程详解
Oct 08 Javascript
Vue vm.$attrs使用场景详解
Mar 08 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
JAVA/JSP学习系列之二
2006/10/09 PHP
PHP在特殊字符前加斜杠的实现代码
2011/07/17 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
PHP封装的字符串加密解密函数
2015/12/18 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
JavaScript中的细节分析
2012/06/30 Javascript
简单的代码实现jquery定时器
2013/11/17 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
理解javascript异步编程
2016/01/27 Javascript
jQuery插件FusionCharts绘制ScrollColumn2D图效果示例【附demo源码下载】
2017/03/22 jQuery
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
2017/10/25 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
详解vue-meta如何让你更优雅的管理头部标签
2018/01/18 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
利用Promise自定义一个GET请求的函数示例代码
2019/03/20 Javascript
前端使用crypto.js进行加密的函数代码
2020/08/16 Javascript
vue v-on:click传递动态参数的步骤
2020/09/11 Javascript
使用typescript快速开发一个cli的实现示例
2020/12/09 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
[03:12]完美世界DOTA2联赛PWL DAY9集锦
2020/11/10 DOTA
用Python编写分析Python程序性能的工具的教程
2015/04/01 Python
Django中url的反向查询的方法
2018/03/14 Python
Python中使用Counter进行字典创建以及key数量统计的方法
2018/07/06 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
python 实现GUI(图形用户界面)编程详解
2019/07/17 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
高中生物教学反思
2014/02/05 职场文书
酒店员工检讨书
2014/02/18 职场文书
2015入党自传格式范文
2015/06/26 职场文书
教师素质教育心得体会
2016/01/19 职场文书
2016党员学习心得体会范文
2016/01/23 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书