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 prototype 使用介绍
Aug 29 Javascript
Node.js实现的简易网页抓取功能示例
Dec 05 Javascript
jQuery根据name属性进行查找的用法分析
Jun 23 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
Aug 03 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
Aug 15 Javascript
详解AngularJS controller调用factory
May 19 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
Jun 26 Javascript
详解webpack的配置文件entry与output
Aug 21 Javascript
JavaScript中Object值合并方法详解
Dec 22 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 Javascript
JavaScript实现简单图片切换
Apr 29 Javascript
JavaScript高级程序设计之基本引用类型
Nov 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
php $_ENV为空的原因分析
2009/06/01 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
php中static和const关键字用法分析
2016/12/07 PHP
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
Javascript编写2048小游戏
2015/07/07 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
jQuery实现的简单日历组件定义与用法示例
2018/12/24 jQuery
微信小程序实现时间进度条功能
2020/11/17 Javascript
[51:30]OG vs LGD 2018国际邀请赛淘汰赛BO3 第二场 8.26
2018/08/30 DOTA
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
2018/01/22 Python
Python实现的购物车功能示例
2018/02/11 Python
python 将日期戳(五位数时间)转换为标准时间
2019/07/11 Python
Django模板Templates使用方法详解
2019/07/19 Python
Django Rest framework频率原理与限制
2019/07/26 Python
Python操作SQLite/MySQL/LMDB数据库的方法
2019/11/07 Python
Python 识别12306图片验证码物品的实现示例
2020/01/20 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
2020/07/01 Python
在印度上传处方,在线订购药品:Medlife
2019/03/28 全球购物
简述数组与指针的区别
2014/01/02 面试题
一些高难度的SQL面试题
2016/11/29 面试题
建议书标准格式
2014/03/12 职场文书
汇源肾宝广告词
2014/03/20 职场文书
2015年推广普通话演讲稿
2015/03/20 职场文书
付款证明格式范文
2015/06/19 职场文书
英文投诉信格式
2015/07/03 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
超外差式晶体管收音机的组装与统调
2021/04/22 无线电
Python入门之使用pandas分析excel数据
2021/05/12 Python
CSS3实现指纹特效代码
2022/03/17 HTML / CSS