浅谈vuex之mutation和action的基本使用


Posted in Javascript onAugust 29, 2017

我们要实现的很简单,就是点击+1的count加一,点击-1的时候count-1

浅谈vuex之mutation和action的基本使用

一、mutation

在vue 中,只有mutation 才能改变state.  mutation 类似事件,每一个mutation都有一个类型和一个处理函数,因为只有mutation 才能改变state, 所以处理函数自动会获得一个默认参数 state. 所谓的类型其实就是名字,action去commit 一个mutation, 它要指定去commit哪个mutation, 所以mutation至少需要一个名字,commit mutation 之后, 要做什么事情,那就需要给它指定一个处理函数, 类型(名字) + 处理函数就构成了mutation. 现在test.js添加mutation.

const store = new Vuex.Store({
  state: {
    count:0
  },
  mutations: {
    // 加1
    increment(state) {
      state.count++;
    },
    // 减1
    decrement(state) {
      state.count--
    }
  }
})

Vue 建议我们mutation 类型用大写常量表示,修改一下,把mutation 类型改为大写

mutations: {
    // 加1
    INCREMENT(state) {
      state.count++;
    },
    // 减1
    DECREMENT(state) {
      state.count--
    }
  }

二、action

action去commit mutations, 所以还要定义action. test.js 里面添加actions.

const store = new Vuex.Store({
  state: {
    count:0
  },
  mutations: {
    // 加1
    INCREMENT(state) {
      state.count++;
    },
    // 减1
    DECREMENT(state) {
      state.count--
    }
  },
  actions: {
    increment(context) {
      context.commit("INCREMENT");
    },
    decrement(context) {
      context.commit("DECREMENT");
    }
  }
})

action 和mutions 的定义方法是类似的,我们要dispatch 一个action, 所以actions 肯定有一个名字,dispatch action 之后它要做事情,就是commit mutation, 所以还要给它指定一个函数。因为要commit mutation ,所以 函数也会自动获得一个默认参数context,  它是一个store 实例,通过它可以获取到store 实例的属性和方法,如 context.state 就会获取到 state 属性, context.commit 就会执行commit命令。

其实actions 还可以简写一下, 因为函数的参数是一个对象,函数中用的是对象中一个方法,我们可以通过对象的解构赋值直接获取到该方法。修改一下 actions

actions: {
    increment({commit}){
      commit("INCREMENT")
    },
    decrement({commit}){
      commit("DECREMENT")
    }
  }

三、dispatch  action

现在就剩下dispatch action 了。什么时候dispatch action 呢? 只有当我们点击按钮的时候. 给按钮添加click 事件,在click 事件处理函数的中dispatch action.

这个时候我们需要新建一个操作组件,我们暂且命名为test.vue

<template>
 <div>
  <div>
    <button @click="add">+1</button>
    <button @click="decrement">-1</button>
  </div>
 </div>
</template>

然后,我们在methods里面获取这两个操作事件

<script>
  export default {
    methods: {
      increment(){
        this.$store.dispatch("increment");
      },
      decrement() {
        this.$store.dispatch("decrement")
      }
    }
  }
</script>

当然上面这种写法比较麻烦,vuex还给我我们提供了mapActions这个函数,它和mapState 是一样的,把我们的 action 直接映射到store 里面的action中。

<script>

  import {mapActions} from 'vuex'
  export default {
    methods: {
      ...mapActions(['increment', 'decrement'])
    }
  }
</script>

如果事件处理函数名字和action的名字不同,给mapActions

提供一个对象,对象的属性是事件处理函数名字, 属性值是 对应的dispatch 的action 的名字。

<script>
import {mapActions} from 'vuex'
export default {
 methods: {
  // 这中写法虽然可行,但是比较麻烦
  // 这时vue 提供了mapAction 函数,
  // 它和mapState 是一样的,把我们的 action 直接映射到store 里面的action中。
  // increment () {
  //  this.$store.dispatch('increment')
  // },
  // decrement () {
  //  this.$store.dispatch('decrement')
  // }
  // 下面我们使用一种比较简洁的写法
  // ...mapActions(['increment', 'decrement'])
  /**
   如果事件处理函数名字和action的名字不同,给mapActions
   提供一个对象,对象的属性是事件处理函数名字, 属性值是 对应的dispatch 的action 的名字。
  */
  // 这里实际是为了改变事件的名字
  ...mapActions(['decrement']),
  ...mapActions({
   add: 'increment'
  })
 }
}
</script>

这时候我们单击按钮,就可以看到count 发生变化。

最后附一张简单的图形解析,看起来应该能更直观一点

浅谈vuex之mutation和action的基本使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
拖动Html元素集合 Drag and Drop any item
Dec 22 Javascript
js获取location.href的参数实例代码
Aug 02 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
Nov 22 Javascript
js propertychange和oninput事件
Sep 28 Javascript
jquery实现鼠标滑过小图时显示大图的方法
Jan 14 Javascript
JavaScript中消除闭包的一般方法介绍
Mar 16 Javascript
JQuery实现动态添加删除评论的方法
May 18 Javascript
JS实现汉字与Unicode码相互转换的方法详解
Apr 28 Javascript
jQuery实现QQ空间汉字转拼音功能示例
Jul 10 jQuery
vue绑定设置属性的多种方式(5)
Aug 16 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 Javascript
如何利用vue实现波谱拟合详解
Nov 05 Javascript
vuex学习之Actions的用法详解
Aug 29 #Javascript
jquery在vue脚手架中的使用方式示例
Aug 29 #jQuery
jQuery 实现鼠标画框并对框内数据选中的实例代码
Aug 29 #jQuery
es6学习之解构时应该注意的点
Aug 29 #Javascript
页面缩放兼容性处理方法(zoom,Firefox火狐浏览器)
Aug 29 #Javascript
详谈Node.js之操作文件系统
Aug 29 #Javascript
js链表操作(实例讲解)
Aug 29 #Javascript
You might like
用PHP生成html分页列表的代码
2007/03/18 PHP
处理单名多值表单的详解
2013/06/08 PHP
浅析php面向对象public private protected 访问修饰符
2013/06/30 PHP
php stream_get_meta_data返回值
2013/09/29 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
laravel自定义分页的实现案例offset()和limit()
2019/10/15 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
浅谈javascript六种数据类型以及特殊注意点
2013/12/20 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
Angular和Vue双向数据绑定的实现原理(重点是vue的双向绑定)
2016/11/22 Javascript
微信小程序 picker-view 组件详解及简单实例
2017/01/10 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
JS实现可控制的进度条
2020/03/25 Javascript
详解React的回调渲染模式
2020/09/10 Javascript
python实现清屏的方法
2015/04/30 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python三级菜单的实例
2017/09/13 Python
python使用folium库绘制地图点击框
2018/09/21 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
2018/10/18 Python
python实现转盘效果 python实现轮盘抽奖游戏
2019/01/22 Python
深入浅析Python中的迭代器
2019/06/04 Python
Django后台admin的使用详解
2019/07/08 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
韩国最大的购物网站:Gmarket
2019/06/20 全球购物
会计专业毕业生自我鉴定
2013/10/29 职场文书
高分子材料与工程专业个人求职信
2013/12/15 职场文书
学生会主席就职演讲稿
2014/01/14 职场文书
继承权公证书
2014/04/09 职场文书
统计员岗位职责
2015/02/11 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
学校体育节班级口号
2015/12/25 职场文书
python pygame入门教程
2021/06/01 Python