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 相关文章推荐
点击广告后才能获得下载地址
Oct 26 Javascript
jQuery下通过replace字符串替换实现大小图片切换
May 22 Javascript
js获取判断上传文件后缀名的示例代码
Feb 19 Javascript
jquery live()调用不存在的解决方法
Feb 26 Javascript
使用JS代码实现点击按钮下载文件
Nov 12 Javascript
Bootstrap源码解读媒体对象、列表组和面板(10)
Dec 26 Javascript
Angular2平滑升级到Angular4的步骤详解
Mar 29 Javascript
vue如何从接口请求数据
Jun 22 Javascript
ionic2屏幕适配实现适配手机、平板等设备的示例代码
Aug 11 Javascript
AngularJS日期格式化常见操作实例分析
May 17 Javascript
node.js制作一个简单的登录拦截器
Feb 10 Javascript
jquery实现穿梭框功能
Jan 19 jQuery
在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
剧场版动画《PSYCHO-PASS 3 FIRST INSPECTOR》3月27日日本上映!
2020/03/06 日漫
php判断ip黑名单程序代码实例
2014/02/24 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
javascript插入样式实现代码
2012/02/22 Javascript
js左侧三级菜单导航实例代码
2013/09/13 Javascript
js快速排序的实现代码
2013/12/08 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
Javascript闭包(Closure)详解
2015/05/05 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
详解BootStrap中Affix控件的使用及保持布局的美观的方法
2016/07/08 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
在vue中配置不同的代理同时访问不同的后台操作
2020/09/11 Javascript
详解vue之自行实现派发与广播(dispatch与broadcast)
2021/01/19 Vue.js
[02:09]DOTA2辉夜杯 EHOME夺冠举杯现场
2015/12/28 DOTA
讲解Python中for循环下的索引变量的作用域
2015/04/15 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
python多线程之事件Event的使用详解
2018/04/27 Python
python实现支付宝当面付(扫码支付)功能
2018/05/30 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
使用Python控制摄像头拍照并发邮件
2019/04/23 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
Python除法之传统除法、Floor除法及真除法实例详解
2019/05/23 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
HTML5打开本地app应用的方法
2016/03/31 HTML / CSS
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
Lookfantastic澳大利亚官网:英国知名美妆购物网站
2021/01/07 全球购物
智能室内花园:Click & Grow
2021/01/29 全球购物
微博营销计划书
2014/01/10 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
教师三严三实心得体会
2014/10/11 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
如何写好竞聘报告
2019/04/03 职场文书
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA