浅谈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 相关文章推荐
js克隆对象、数组的常用方法介绍
Sep 26 Javascript
Area 区域实现post提交数据的js写法
Apr 22 Javascript
js实现简单的左右两边固定广告效果实例
Apr 10 Javascript
jquery的幻灯片图片切换效果代码分享
Sep 07 Javascript
AngularJS 过滤器的简单实例
Jul 27 Javascript
vue组件中的数据传递方法
May 14 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
Sep 18 Javascript
微信小程序实现底部导航
Nov 05 Javascript
Vue自定义指令写法与个人理解
Feb 09 Javascript
vue2.0实现的tab标签切换效果(内容可自定义)示例
Feb 11 Javascript
highcharts.js数据绑定方式代码实例
Nov 13 Javascript
JS数组reduce()方法原理及使用技巧解析
Jul 14 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结合curl实现多线程抓取
2015/07/09 PHP
PHP验证码生成原理和实现
2016/01/24 PHP
PHP微信开发之根据用户回复关键词\位置返回附近信息
2016/06/24 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
2016/07/25 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
jquery插件之easing使用
2010/08/19 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
使用CamanJS在Web页面上处理图像的技巧
2015/08/18 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
使用jquery.qrcode.js生成二维码插件
2016/10/17 Javascript
js 点击a标签 获取a的自定义属性方法
2016/11/21 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
Vue 组件注册实例详解
2019/02/23 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
python urllib爬虫模块使用解析
2019/09/05 Python
python next()和iter()函数原理解析
2020/02/07 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
python实现简单的五子棋游戏
2020/09/01 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
优秀护士获奖感言
2014/02/20 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
交通事故和解协议书
2014/09/25 职场文书
公司管理制度范本
2015/08/03 职场文书
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js