vuex的一个小问题?

vuex为什么要设置action 和 mutation ?

vue项目中常常用action
比如在action中异步获取数据,在提交(commit)到mutation

我的疑惑是设置两个分开的部分的意义何在?

难道不能直接到action中修改state的值么?

参考:vuex官网似乎特别强调了同步异步区别 :https://vuex.vuejs.org/zh/guide/structure.html

阅读 2.1k
3 个回答

因为所有同步操作都没有副作用,而异步操作有副作用。

具体区别是:

  • 给定当前状态 A,执行同步操作,永远会得到状态 B
  • 给定当前状态 A,执行异步操作,无法预测之后的状态

不开启严格模式可以,但是不提倡。最好还是按照文档规范编写,方便后期维护

以下是尤大大亲自的回复摘抄某乎

中文翻译可能有些偏差(不是我翻的)。区分 actions 和 mutations 并不是为了解决竞态问题,而是为了能用 devtools 追踪状态变化。
事实上在 vuex 里面 actions 只是一个架构性的概念,并不是必须的,说到底只是一个函数,你在里面想干嘛都可以,只要最后触发 mutation 就行。异步竞态怎么处理那是用户自己的事情。vuex 真正限制你的只有 mutation 必须是同步的这一点(在 redux 里面就好像 reducer 必须同步返回下一个状态一样)。
同步的意义在于这样每一个 mutation 执行完成后都可以对应到一个新的状态(和 reducer 一样),这样 devtools 就可以打个 snapshot 存下来,然后就可以随便 time-travel 了。
如果你开着 devtool 调用一个异步的 action,你可以清楚地看到它所调用的 mutation 是何时被记录下来的,并且可以立刻查看它们对应的状态。其实我有个点子一直没时间做,那就是把记录下来的 mutations 做成类似 rx-marble 那样的时间线图,对于理解应用的异步状态变化很有帮助。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题