Vuex中的Mutations的具体使用方法


Posted in Javascript onJune 01, 2020

在 Vuex 中 store 数据改变的唯一方法就是提交 mutations。mutations里面装着一些改变数据方法的集合,这是Vuex 设计很重要的一点,就是把处理数据逻辑方法全部放在 mutations 里面,使得数据和视图分离。

Mutations使用

Vuex 中的 mutations 非常类似于事件,每个 mutations 都有一个字符串的事件类型(type)和一个回调函数(handler),也可以理解为{type:handler()},这和订阅发布有点类似。先注册事件,当触发响应类型的时候调用handker(),调用type的时候需要用到store.commit方法。

示例:

这个回调函数会接受state 作为第一个参数:

const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
     // 事件类型 type 为 increment
    increment (state) { 
      // 变更状态
      state.count++
    }
  }
})

我们不能直接使用store.mutations.increment() 来调用,Vuex 规定必须使用 store.commit 来触发对应 type 的方法:

store.commit('increment')

提交载荷(Payload)

载荷简单的理解就是往 handler(state) 中传参 handler(state, pryload) 。

示例:

大多数情况下,载荷是一个对象:

mutations: {
 // 提交荷载
 increment (state, payload) {
  state.count += payload.amount
 }
}

提交荷载有两种方式:

// 把载荷和type分开提交
store.commit('increment', {
 amount: 10
})

// 整个对象都作为载荷传给mutation函数
store.commit({
 type: 'increment',
 amount: 10
})

我们可以根据自己的喜好来选择使用哪种提交方式。

commit

我们可以在组件中使用 this.$store.commit('xxx') 提交 mutations。

示例:
或者可以使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

示例:

在使用mapMutations 辅助函数之前同样需要先引入:

<script>
import { mapMutations } from 'vuex'
export default {
  computed:{
    count(){
      return this.$store.state.count
    }
  },
  methods:{
    ...mapMutations([
      'increment',
      'decrement'
    ])
  }
}
</script>

Mutations 需遵守 Vue 的响应规则

Vuex 的 store 中的状态是响应式的,所以当我们变更状态时,监视状态的 Vue 组件也会自动更新。

这也意味着 Vuex 中的 mutations 也需要与使用 Vue 一样遵守一些注意事项,如下所示:

  • 最好提前在 store 中初始化好所有所需属性。
  • 当需要在对象上添加新属性时,应该使用 Vue.set(obj, 'newProp', 123),或者以新对象替换老对象。例如利用对象展开运算符可以写成:state.obj = {...state.obj, newProp: 123 }。

使用常量替代 Mutations 事件类型

使用常量替代 mutations 事件类型在各种 Flux 实现中是很常见的模式。这样可以使 linter 之类的工具发挥作用,同时把这些常量放在单独的文件中可以让你的代码合作者对整个 app 包含的 mutations 一目了然:

// mutation-types.js
export const SOME_MUTATION = 'SOME_MUTATION'

store.js 文件内容如下所示:

// store.js
import Vuex from 'vuex'
import { SOME_MUTATION } from './mutation-types'

const store = new Vuex.Store({
 state: { ... },
 mutations: {
  // 使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
  [SOME_MUTATION] (state) {
   // mutate state
  }
 }
})

我们知道mutation 是通过store.commit('increment')的方式调用的,其中increment方法是以字符串的形式代入。如果项目小,一个人开发的话倒还好,但是项目大了,编写代码的人多了,那就麻烦了,因为需要 commit 的方法一多,就会显得特别混乱,而且以字符串形式代入的话,一旦出了错,很难排查。

所以,在需要多人协作的大型项目中,最好还是用常量的形式来处理 mutation。

必须是同步函数

我们要记住的是,Mutation 必须是同步函数。

因为我们之所以要通过提交 mutation 的方式来改变状态数据,是因为我们想要更明确地追踪到状态的变化。如果是类似下面这样异步的话:

mutations: {
 someMutation (state) {
  api.callAsyncMethod(() => {
   state.count++
  })
 }
}

我们就不知道什么时候状态会发生改变,所以也就无法追踪了,这与 Mutation 的设计初心相悖,所以强制规定它必须是同步函数。

store.commit('increment') // 任何由'increment'导致的状态变更都应该在此刻完成

到此这篇关于Vuex中的Mutations的具体使用方法的文章就介绍到这了,更多相关Vuex Mutations内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript TextArea动态显示剩余字符
Oct 22 Javascript
JavaScript 学习笔记(十三)Dom创建表格
Jan 21 Javascript
YUI模块开发原理详解
Nov 18 Javascript
jQuery照片伸缩效果不影响其他元素的布局
May 09 Javascript
javascript中call,apply,bind的用法对比分析
Feb 12 Javascript
使用Chrome浏览器调试AngularJS应用的方法
Jun 18 Javascript
JS打印组合功能
Aug 04 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
Feb 16 Javascript
浅谈ajax在jquery中的请求和servlet中的响应
Jan 22 jQuery
vue将对象新增的属性添加到检测序列的方法
Feb 24 Javascript
vue 如何使用递归组件
Oct 23 Javascript
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
Apr 09 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 #Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 #Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 #Javascript
JS如何寻找数组中心索引过程解析
Jun 01 #Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
Jun 01 #Javascript
bootstrap-table后端分页功能完整实例
Jun 01 #Javascript
jQuery实现倒计时功能完整示例
Jun 01 #jQuery
You might like
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
php简单压缩css样式示例
2016/09/22 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
PHP PDO和消息队列的个人理解与应用实例分析
2019/11/25 PHP
Jquery 组合form元素为json格式,asp.net反序列化
2009/07/09 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
BootStrap智能表单demo示例详解
2016/06/13 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
jsonp跨域请求实现示例
2017/03/13 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
如何在js代码中消灭for循环实例详解
2018/07/29 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
javascript实现遮罩层动态效果实例
2019/05/14 Javascript
使用express获取微信小程序二维码小记
2019/05/21 Javascript
JS学习笔记之贪吃蛇小游戏demo实例详解
2019/05/29 Javascript
element-ui 中使用upload多文件上传只请求一次接口
2019/07/19 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
2021/01/13 Vue.js
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
Python运算符重载详解及实例代码
2017/03/07 Python
Python3 伪装浏览器的方法示例
2017/11/23 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
毕业生个人的自我评价优秀范文
2013/10/03 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
我的法兰西岁月观后感
2015/06/09 职场文书
2019求职信大礼包
2019/05/15 职场文书
详解TypeScript中的类型保护
2021/04/29 Javascript
SQL中的三种去重方法小结
2021/11/01 SQL Server
《遗弃》开发商删推文要跑路?官方回应:还在开发
2022/04/03 其他游戏