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 相关文章推荐
文本框回车提交与禁止提交示例
Sep 27 Javascript
JS的参数传递示例介绍
Feb 08 Javascript
javascript实现字符串反转的方法
Feb 05 Javascript
jQuery.position()方法获取不到值的安全替换方法
Mar 13 Javascript
JS常用算法实现代码
Nov 14 Javascript
js实现华丽的九九乘法表效果
Mar 29 Javascript
Bootstrap实现各种进度条样式详解
Apr 13 Javascript
详解vue express启动数据服务
Jul 05 Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 Javascript
js实现省级联动(数据结构优化)
Jul 17 Javascript
ES6学习教程之Promise用法详解
Nov 22 Javascript
vue如何使用rem适配
Feb 06 Vue.js
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面向对象全攻略 (二) 实例化对象 使用对象成员
2009/09/30 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
php安装dblib扩展,连接mssql的具体步骤
2017/03/02 PHP
php过滤htmlspecialchars() 函数实现把预定义的字符转换为 HTML 实体用法分析
2019/06/25 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
详谈 Jquery Ajax异步处理Json数据.
2011/09/09 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
js函数的延迟加载实现代码
2012/10/11 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
node.js实现快速截图
2016/08/27 Javascript
JavaScript计算值然后把值嵌入到html中的实现方法
2016/10/29 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
vue-router实现编程式导航的代码实例
2019/01/19 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
在vue中使用inheritAttrs实现组件的扩展性介绍
2020/12/07 Vue.js
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
[01:52]DOTA2完美大师赛Vega战队趣味视频——kpii老师小课堂
2017/11/25 DOTA
Python代码调试的几种方法总结
2015/04/15 Python
python 生成器协程运算实例
2017/09/04 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
python matplotlib 绘图 和 dpi对应关系详解
2020/03/14 Python
Python 高效编程技巧分享
2020/09/10 Python
教师求职推荐信范文
2013/11/20 职场文书
校运会入场式解说词
2014/02/10 职场文书
元旦晚会主持词
2014/03/24 职场文书
员工合理化建议书
2014/05/19 职场文书
开工仪式策划方案
2014/05/23 职场文书
党员民主生活会对照检查材料思想汇报
2014/09/28 职场文书
新闻稿件写作范文
2015/07/18 职场文书
暑假打工感想
2015/08/07 职场文书
Nginx配置使用详解
2022/07/07 Servers