Vuex 中是否应该在actiion中直接调用state并修改

297 阅读1分钟

这里是尤大大的解答: www.zhihu.com/question/48…

中文翻译可能有些偏差(不是我翻的)。

区分 actions 和 mutations 并不是为了解决竞态问题,而是为了能用 devtools 追踪状态变化。

事实上在 vuex 里面 actions 只是一个架构性的概念,并不是必须的,说到底只是一个函数,你在里面想干嘛都可以,只要最后触发 mutation 就行。

异步竞态怎么处理那是用户自己的事情。vuex 真正限制你的只有 mutation 必须是同步的这一点(在 redux 里面就好像 reducer 必须同步返回下一个状态一样)。

同步的意义在于这样每一个 mutation 执行完成后都可以对应到一个新的状态(和 reducer 一样),这样 devtools 就可以打个 snapshot 存下来,然后就可以随便 time-travel 了。

如果你开着 devtool 调用一个异步的 action,你可以清楚地看到它所调用的 mutation 是何时被记录下来的,并且可以立刻查看它们对应的状态。

其实我有个点子一直没时间做,那就是把记录下来的 mutations 做成类似 rx-marble 那样的时间线图,对于理解应用的异步状态变化很有帮助。


通过上面能很好的理解了,简单来说就是为了state能被devtool监控有效的监控到

竞态问题:不同异步(eg: Promise.all())触发了相同的state的操作,没办法确定按顺序的返回最后一个操作state。


如果这篇文章有用,欢迎评论, 点赞, 加关注

我是leo:祝大家早日升职加薪。