浅谈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 相关文章推荐
JAVASCRIPT函数作用域和提前声明 分享
Aug 22 Javascript
JavaScript中的Math.E属性使用详解
Jun 12 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
Mar 01 Javascript
深入解析Backbone.js框架的依赖库Underscore.js的作用
May 07 Javascript
JavaScript 字符串常用操作小结(非常实用)
Nov 30 Javascript
想用好React的你必须要知道的一些事情
Jul 24 Javascript
JS解析后台返回的JSON格式数据实例
Aug 06 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
微信小程序实现语音识别转文字功能及遇到的坑
Aug 02 Javascript
vue封装可复用组件confirm,并绑定在vue原型上的示例
Oct 31 Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 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
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
解决laravel资源加载路径设置的问题
2019/10/14 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
同一个表单 根据要求递交到不同页面的实现方法小结
2009/08/05 Javascript
jquery json 实例代码
2010/12/02 Javascript
jquery对表单操作2
2011/04/06 Javascript
打开新窗口关闭当前页面不弹出关闭提示js代码
2013/03/18 Javascript
当鼠标滑过文本框自动选中输入框内容的JS代码分享
2013/11/26 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
js实现不提交表单获取单选按钮值的方法
2015/08/21 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
canvas实现绘制吃豆鱼效果
2017/01/12 Javascript
Bootstrap实现的经典栅格布局效果实例【附demo源码】
2017/03/30 Javascript
浅谈node的事件机制
2017/10/09 Javascript
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
vue实现匀速轮播效果
2020/06/29 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[01:39:42]Fnatic vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python获取远程文件大小的函数代码分享
2014/05/13 Python
Python中的pygal安装和绘制直方图代码分享
2017/12/08 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
和孩子一起学习python之变量命名规则
2018/05/27 Python
深入理解Django-Signals信号量
2019/02/19 Python
python实现多进程按序号批量修改文件名的方法示例
2019/12/30 Python
Python 实现自动完成A4标签排版打印功能
2020/04/09 Python
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
八年级数学教学反思
2014/01/31 职场文书
行政秘书工作自我鉴定
2014/09/15 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
Python中else的三种使用场景
2021/06/16 Python
Java 中的 Unsafe 魔法类的作用大全
2021/06/26 Java/Android