前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >vuex中直接修改state 与 commit来修改state的区别

vuex中直接修改state 与 commit来修改state的区别

作者头像
winty
发布2021-07-01 18:23:09
发布2021-07-01 18:23:09
2.6K00
代码可运行
举报
文章被收录于专栏:前端Q前端Q
运行总次数:0
代码可运行

背景

当我们使用vuex进行状态管理的时候,我们总是会看到一句话更改Vuex 的store 中的状态的唯一方法是提交commitzongz,那么我们不提交commit就没法修改state的值的了吗?其实是不对的,我们也可以通过下面的方法进行state值的修改。

代码语言:javascript
代码运行次数:0
运行
复制
this.$store.state.aaa = xxx

并且我们发现直接修改state时,store中的state能够改变,并且是响应式的,并没有报错。但是为啥文档还要强调我们修改state的唯一方式是提交commit呢?

当我们将vuex的模式改成严格模式的时候,我们在通过直接修改state的方式修改状态的时候,控制台会报错。

官方文档中也进行了描述

开启严格模式,仅需在创建 store 的时候传入 strict: true;在严格模式下,无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。

解答

使用commit提交状态修改是为了配合开发者工具使用,使得状态更好的被最终,保存状态快照,实现时间漫游/回滚之类的操作。

其实官方文档有很好的解释

这个简单的约定能够让你的意图更加明显,这样你在阅读代码的时候能更容易地解读应用内部的状态改变。此外,这样也让我们有机会去实现一些能记录每次状态改变,保存状态快照的调试工具。有了它,我们甚至可以实现如时间穿梭般的调试体验。

源码分析

首先我们看看当我们开启严格模式后,vuex是怎么处理的

开启严格模式后我们将执行enableStrictMode函数,这个函数内部通过watch来判断state的更新,当state变化后,如果是非生产模式,判断store._committing的值来是否抛错。

我们发现store._committing的默认值是false,那么默认情况下,当state改变后必然是会抛错的。

我们接下来看看通过commit来修改state的逻辑

我们发现,当通过commit来进行状态修改的时候,会将_committing设置为true,这样就不会进行报错了。

总结

根据上面的分析,开发模式的时候,我们在使用vuex的时候最好设置成严格模式,修改state的时候我们不要直接修改,而是通过commit来提交。主要是为了状态能够很好的跟踪,开发者工具更好的处理状态变化,更好的调试体验。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端Q 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 解答
  • 源码分析
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档