浅谈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 相关文章推荐
如何实现iframe(嵌入式帧)的自适应高度
Jul 26 Javascript
javascript 添加和移除函数的通用方法
Oct 20 Javascript
分享20个提升网站界面体验的jQuery插件
Dec 15 Javascript
jQuery插件bxSlider实现响应式焦点图
Apr 12 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
javascript检查某个元素在数组中的索引值
Mar 30 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
Jun 21 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 Javascript
angularjs项目的页面跳转如何实现(5种方法)
May 25 Javascript
微信小程序 如何获取网络状态
Jul 26 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
Aug 06 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
javascript replace()正则替换实现代码
2010/02/26 Javascript
关于可运行代码无法正常执行的使用说明
2010/05/13 Javascript
SWFObject 2.1以上版本语法介绍
2010/07/10 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
用JavaScript实现类似于ListBox功能示例代码
2014/03/09 Javascript
jquery网页回到顶部效果(图标渐隐,自写)
2014/06/16 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
gameboy网页闯关游戏(riddle webgame)--仿微信聊天的前端页面设计和难点
2016/02/21 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
DropDownList控件绑定数据源的三种方法
2016/12/24 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
JavaScript作用域、闭包、对象与原型链概念及用法实例总结
2018/08/20 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
javascript设计模式 ? 职责链模式原理与用法实例分析
2020/04/16 Javascript
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
python使用openpyxl库修改excel表格数据方法
2018/05/03 Python
Python学习小技巧总结
2018/06/10 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
python实现企业微信定时发送文本消息的实例代码
2020/11/25 Python
分享CSS3制作卡片式图片的方法
2016/07/08 HTML / CSS
html5 canvas里绘制椭圆并保持线条粗细均匀的技巧
2013/03/25 HTML / CSS
美国最大的网络男装服装品牌:Bonobos
2017/05/25 全球购物
static关键字的用法
2013/10/07 面试题
企业车辆管理制度
2014/01/24 职场文书
安全生产管理责任书
2014/04/16 职场文书
工程项目经理任命书
2014/06/05 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
2014党员学习兰辉先进事迹思想汇报
2014/09/17 职场文书
导游词之五台山
2019/10/11 职场文书
Python pandas读取CSV文件的注意事项(适合新手)
2021/06/20 Python