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下将字符串当函数执行的方法
Jul 13 Javascript
JQuery UI的拖拽功能实现方法小结
Mar 14 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
Jan 09 Javascript
window.location.href IE下跳转失效的解决方法
Mar 27 Javascript
JS遍历Json字符串中键值对先转成JSON对象再遍历
Aug 15 Javascript
jquery实现的代替传统checkbox样式插件
Jun 19 Javascript
java必学必会之static关键字
Dec 03 Javascript
javascript中对象的定义、使用以及对象和原型链操作小结
Dec 14 Javascript
bootstrap suggest下拉框使用详解
Apr 10 Javascript
vue-awesome-swiper滑块插件使用方法详解
Nov 27 Javascript
Vue之mixin全局的用法详解
Aug 22 Javascript
javascript实现对话框功能警告(alert 消息对话框)确认(confirm 消息对话框)
May 07 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
基于js实现的限制文本框只可以输入数字
2016/12/05 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
详解VUE 数组更新
2017/12/16 Javascript
iview table高度动态设置方法
2018/03/14 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
详解如何配置vue-cli3.0的vue.config.js
2018/08/23 Javascript
微信小程序中转义字符的处理方法
2019/03/28 Javascript
javascript数组元素删除方法delete和splice解析
2019/12/09 Javascript
[00:52]DOTA2第二届亚洲邀请赛预选赛宣传片
2017/01/13 DOTA
浅谈Python 集合(set)类型的操作——并交差
2016/06/30 Python
Python之re操作方法(详解)
2017/06/14 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
告诉你怎样写创业计划书
2014/01/27 职场文书
《在家里》教后反思
2014/03/01 职场文书
文秘求职信范文
2014/04/10 职场文书
美术社团活动总结
2014/06/27 职场文书
村党支部书记个人对照材料汇报
2014/10/26 职场文书
幼儿园万圣节活动总结
2015/05/05 职场文书
收入证明申请书
2015/06/12 职场文书
小学班主任教育随笔
2015/08/15 职场文书
护士爱岗敬业心得体会
2016/01/25 职场文书
GoLang中生成UUID唯一标识的实现
2021/05/08 Golang
我的收音机情缘
2022/04/05 无线电
Python matplotlib绘制雷达图
2022/04/13 Python