浅谈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 相关文章推荐
基于jquery的lazy loader插件实现图片的延迟加载[简单使用]
May 07 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
Jan 11 Javascript
javascript实现TreeView 无刷新展开的实例代码
Jul 13 Javascript
jquery制作LED 时钟特效
Feb 01 Javascript
JS操作JSON方法总结(推荐)
Jun 14 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
微信小程序 触控事件详细介绍
Oct 17 Javascript
bootstrap导航条实现代码
Dec 28 Javascript
微信小程序动态添加分享数据
Jun 14 Javascript
JS实现碰撞检测的方法分析
Jan 19 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
Aug 02 Javascript
Node.js path模块,获取文件后缀名操作
Nov 07 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版(2)
2006/10/09 PHP
用PHP读取和编写XML DOM的实现代码
2011/02/03 PHP
php4与php5的区别小结(配置异同)
2011/12/20 PHP
php通过隐藏表单控件获取到前两个页面的url
2014/09/09 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
php正则preg_replace_callback函数用法实例
2015/06/01 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
JavaScript 打地鼠游戏代码说明
2010/10/12 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
js导出table数据到excel即导出为EXCEL文档的方法
2013/10/10 Javascript
JQ获取动态加载的图片大小的正确方法分享
2013/11/08 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
关于JS中的apply,call,bind的深入解析
2016/04/05 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
javascript使用btoa和atob来进行Base64转码和解码
2017/03/20 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
Vue3.0中的monorepo管理模式的实现
2019/10/14 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
vue 使用 sortable 实现 el-table 拖拽排序功能
2020/12/26 Vue.js
微信小程序选择图片控件
2021/01/19 Javascript
使用python实现拉钩网上的FizzBuzzWhizz问题示例
2014/05/05 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python随机数函数代码实例解析
2020/02/09 Python
Python xpath表达式如何实现数据处理
2020/06/13 Python
小学语文教研活动总结
2014/07/01 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
团结友爱主题班会
2015/08/13 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
新手初学Java网络编程
2021/07/07 Java/Android