随手写系列--面试官问vuex里面action可以去掉吗或者action与mutation差异?你只会回答可以/不知道??

364 阅读2分钟

前文:vuex本质是挂载一个名为store的vm组件在Vue的上下文环境

1.所以this.$store都是执行绑定的同一个sotre

2.同时state因为在vm组件里面的data--所以具备响应式

先看一个问题:可以通过this.$store.state进行修改state数据吗

效果上可以,但不建议

原因: 先看一下state修改的源码--mutation操作是调用_withCommit

_withCommit (fn) {
// 保存之前的提交状态 
const committing = this._committing 
// 进行本次提交,若不设置为true,直接修改state,strict模式下,Vuex将会产生非法修改state的警告 
this._committing = true 
// 执行state的修改操作 
fn() 
// 修改完成,还原本次修改之前的状态 
this._committing = committing }

官方文档中也进行了描述

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

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

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

这里还是有点懵?

简单说明: vuex使用了devtoolPlugin插件来监听state change的变化快照,方便state的回溯--简称时空穿梭/时空漫游

如果直接修改state可能不会生成快照

现在就开始正文:

mutation里面操作是调用_withCommit来同步更新变量修改 action是普通函数,来替mutation处理异步逻辑--如果将异步逻辑放到mutation会有什么后果

上面提到state改变是会生成快照,--修改前快照和修改后快照 那么如果异步的,有可能两个异步AB同时执行,导致接受的修改后快照不对应--就是B的修改后快照有可能先回来--导致快照的顺序不对