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 相关文章推荐
javascript实现滑动解锁功能
Dec 31 Javascript
js 获取元素在页面上的偏移量的方法汇总
Apr 13 Javascript
jquery制作属于自己的select自定义样式
Nov 23 Javascript
javascript运动效果实例总结(放大缩小、滑动淡入、滚动)
Jan 08 Javascript
AngularJS中过滤器的使用与自定义实例代码
Sep 17 Javascript
angular4实现tab栏切换的方法示例
Oct 21 Javascript
vue router动态路由下让每个子路由都是独立组件的解决方案
Apr 24 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 Javascript
通过webpack引入第三方库的方法
Jul 20 Javascript
Vue注册组件命名时不能用大写的原因浅析
Apr 25 Javascript
基于JavaScript实现十五拼图代码实例
Apr 26 Javascript
关于AngularJS中几种Providers的区别总结
May 17 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
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
php正则表达式验证(邮件地址、Url地址、电话号码、邮政编码)
2016/03/14 PHP
php中preg_replace_callback函数简单用法示例
2016/07/21 PHP
在php的yii2框架中整合hbase库的方法
2018/09/20 PHP
非常好的js代码
2006/06/27 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
动态表格Table类的实现
2009/08/26 Javascript
mysql输出数据赋给js变量报unterminated string literal错误原因
2010/05/22 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
项目实践一图片上传之form表单还是base64前端图片压缩(前端图片压缩)
2016/07/28 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
原生js实现查询天气小应用
2016/12/09 Javascript
基于Marquee.js插件实现的跑马灯效果示例
2017/01/25 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
python+mysql实现简单的web程序
2014/09/11 Python
python解析xml文件操作实例
2014/10/05 Python
python计算日期之间的放假日期
2018/06/05 Python
pip install urllib2不能安装的解决方法
2018/06/12 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
JMS中Topic和Queue有什么区别
2013/05/15 面试题
Hibernate持久层技术
2013/12/16 面试题
关于打架的检讨书
2014/01/17 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
Golang生成Excel文档的方法步骤
2021/06/09 Golang
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
一条慢SQL语句引发的改造之路
2022/03/16 MySQL