vue-vuex中使用commit提交mutation来修改state的方法详解


Posted in Javascript onSeptember 16, 2018

在vuex中,关于修改state的方式,需要commit提交mutation。官方文档中有这么一句话:

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。

为了搞清楚其原因,查阅了很多资料,发现其它人在做vuex的源码解析的时候,并没有将这点说的很明白。

所以只好自己去查看vuex的源码,并且自己做demo进行验证。

但是试验后,发现直接修改state时,store中的state能够改变,并且是响应式的,并没有报错。跟commit提交mutation的方式没啥区别。

后来在github上遇到一位朋友,提醒试试严格模式下会发生什么。

一、两种修改state方式的区别

在vuex官方文档上看到了关于严格模式的描述:

开启严格模式,仅需在创建 store 的时候传入 strict: true;

在严格模式下,无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。

于是,将vuex设置成了严格模式。

直接修改state发现控制台确实是报出了错误,但是state修改成功,并且依然是响应式的。

错误提示:

Do not mutate vuex store state outside mutation handlers.

vue-vuex中使用commit提交mutation来修改state的方法详解

通过commit 提交 mutation 的方式来修改 state 时,vue的调试工具能够记录每一次state的变化,这样方便调试。但是如果是直接修改state,则没有这个记录。

vue-vuex中使用commit提交mutation来修改state的方法详解

commit修改state源码分析

以上已经讨论了在严格模式下,直接修改state会造成报错。接下来通过分析源码来一探究竟。

首先应该分析commit函数的代码,因为mutation是通过commit函数来执行的。

vue-vuex中使用commit提交mutation来修改state的方法详解

在commit函数内部,由this._commit()函数来修改state。那么 _withCommit 又是什么呢,接着看 _withCommit 的代码:

vue-vuex中使用commit提交mutation来修改state的方法详解

_withCommit 函数的参数 fn 就是修改state的函数。在执行 fn() 之前,会将 this._committing 设置为 true。等到fn()执行完毕后,又将 this._committing 的值进行恢复。那么为什么要将 this._withCommitting设置为true,其作用到底是什么。在vuex/src/store.js 的开头发现了判断严格模式的代码:

vue-vuex中使用commit提交mutation来修改state的方法详解

这三行代码很简单:当 vuex设置为严格模式的时候,就会执行 enableStrictMode 函数。那么 enableStrictMode 又是什么鬼?

vue-vuex中使用commit提交mutation来修改state的方法详解

在 enableStrictMode 函数内部,调用了 $watch 函数来观察 state的变化。当state变化时,就会调用 assert 函数,判断 store._committing(即 上文的 this._committing) 的值,如果不为 true,就会报出异常:

Do not mutate vuex store state outside mutation handlers.

所以,如果通过外部直接修改state,则没有执行 commit 函数,也就没有执行 _withCommit 函数,进而 this._withCommitting 的值 不为 true,故当执行 enableStrictMode 时,则会执行 assert 函数,因为_withCommitting不为true,则报出异常了。

结语

综上所述,在vuex中,最好设置成严格模式,并且按照文档的要求,通过commit提交mutation的方式来修改state,而不要直接修改state。不然,控制台会报错,并且vue调试工具不会记录state的变化,无法调试。

以上这篇vue-vuex中使用commit提交mutation来修改state的方法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS合并数组的几种方法及优劣比较
Sep 19 Javascript
node.js中watch机制详解
Nov 17 Javascript
JS实现让网页背景图片斜向移动的方法
Feb 25 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
Nov 07 Javascript
关于javascript原型的修改与重写(覆盖)差别详解
Aug 31 Javascript
本地存储localStorage用法详解
Jul 31 Javascript
基于Vue实现支持按周切换的日历
Sep 24 Javascript
vue.js实例对象+组件树的详细介绍
Oct 20 Javascript
浅谈vue项目重构技术要点和总结
Jan 23 Javascript
使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例
Jan 25 jQuery
为jquery的ajax请求添加超时timeout时间的操作方法
Sep 04 jQuery
JavaScript undefined及null区别实例解析
Jul 21 Javascript
在Vue-cli里应用Vuex的state和mutations方法
Sep 16 #Javascript
分享5个好用的javascript文件上传插件
Sep 16 #Javascript
vuex直接赋值的三种方法总结
Sep 16 #Javascript
vue 实现边输入边搜索功能的实例讲解
Sep 16 #Javascript
vue2过滤器模糊查询方法
Sep 16 #Javascript
vue里面使用mui的弹出日期选择插件实例
Sep 16 #Javascript
vue 界面刷新数据被清除 localStorage的使用详解
Sep 16 #Javascript
You might like
PHP与SQL注入攻击[一]
2007/04/17 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
thinkPHP中session()方法用法详解
2016/12/08 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
ThinkPHP3.2框架操作Redis的方法分析
2019/05/05 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
AngularJS中的Promise详细介绍及实例代码
2016/12/13 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
jQuery操作css样式
2017/05/15 jQuery
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
微信小程序中this.data与this.setData的区别详解
2018/09/17 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
js实现div色块碰撞
2020/01/16 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
Python中使用copy模块实现列表(list)拷贝
2015/04/14 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python如何实现视频转代码视频
2019/06/17 Python
python中eval与int的区别浅析
2019/08/11 Python
浅析python内置模块collections
2019/11/15 Python
python装饰器代替set get方法实例
2019/12/19 Python
Python3中小括号()、中括号[]、花括号{}的区别详解
2020/11/15 Python
英语专业学生的自我评价
2013/12/30 职场文书
法人委托书范本
2014/04/04 职场文书
施工安全生产承诺书
2014/05/23 职场文书
社保转移委托书范本
2014/10/08 职场文书
新生入学欢迎词
2015/01/26 职场文书
2016年教师节感言
2015/12/09 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书