浅谈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 Tools Dateinput使用介绍
Jul 14 Javascript
jQuery针对各类元素操作基础教程
Aug 29 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
Oct 20 Javascript
js实现将选中内容分享到新浪或腾讯微博
Dec 16 Javascript
JavaScript转换数据库DateTime字段类型方法
Jun 27 Javascript
浅谈mvvm-simple双向绑定简单实现
Apr 18 Javascript
详解ES6中的Map与Set集合
Mar 22 Javascript
详解在Javascript中进行面向切面编程
Apr 28 Javascript
在layui下对元素进行事件绑定的实例
Sep 06 Javascript
js实现图片无缝循环轮播
Oct 28 Javascript
vant中的toast轻提示实现代码
Nov 04 Javascript
vue基于Echarts的拖拽数据可视化功能实现
Dec 04 Vue.js
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实现获取及设置用户访问页面语言类
2014/09/24 PHP
非常好的js代码
2006/06/27 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
js a标签点击事件
2017/03/30 Javascript
微信小程序 连续旋转动画(this.animation.rotate)详解
2017/04/07 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[02:47]3.19DOTA2发布会 国服成长历程回顾
2014/03/25 DOTA
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
opencv实现简单人脸识别
2021/02/19 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
深入了解Python 变量作用域
2020/07/24 Python
10行Python代码实现Web自动化管控的示例代码
2020/08/14 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
python输入中文的实例方法
2020/09/14 Python
python实现登录与注册系统
2020/11/30 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
24岁生日感言
2014/01/13 职场文书
高一政治教学反思
2014/01/28 职场文书
社区中秋节活动方案
2014/01/29 职场文书
计算机大学生职业生涯规划书范文
2014/02/19 职场文书
党员公开承诺书
2014/03/25 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
民事代理词范文
2015/05/25 职场文书
2016年“我们的节日·重阳节”主题活动总结
2016/04/01 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
openstack云计算keystone组件工作介绍
2022/04/20 Servers