之前阅读官方文档时,了解到当要改变vuex的state的时候必须要用commit来提交一个mutation,像这样:
this.$store.commit("someState",...)
//或者
this.$store.dispatch("changeSomeState",...)
但是一个刚接触vue的朋友在写代码的时直接使用赋值的形式来改变state,像这样
this.$store.state[someState] = XXX
也能够成功完成他想要的效果,
那么请问,
这里的官方文档中说的必须要使用commit提交一个Mutation来改变state,是仅仅需要一个规范来代码可读性或者说明确每个状态改变的地方,还是说有其他的作用,直接赋值会有什么弊端吗?
从效果上来说没有影响但是不建议这么做.谈一下我的理解.
vuex 从功能上来说就是一个前端缓存系统.
解决了 SPA 不同组件之间数据共享的问题
那么到底如何用,为什么会存在 mutation 等概念呢?
你可以看一下官方文档示例 shopping-cart.
这个范例模拟电商中,添加商品到购物车,并进行结算的逻辑.
核心逻辑包括.
站在用户的角度,用户只做了两件事
在这里,添加商品会修改购物车的显示.
最简单的做法就把这些数据都放在父组件.
但是看一下官方示例如何实现的.
定义了两个组件
那么组件数据呢?全部放在了 vuex 中进行管理.
为什么要这么做,为什么不直接放在父组件里面呢?
我们把上面的逻辑利用状态图表示

可以看到这个逻辑异常清晰.
在回到问题本身直接修改有什么危害?
针对此提一下一些使用技巧.
下回在用 vuex 时考虑如下问题:
对于用户层暴露的逻辑事件是什么?
然后把状态图画出来,利用 vuex 中的语法编写.
回到上面问题,假设现在用户的购物车添加了收藏,取消等逻辑,此时对于你而言只是单纯的增加了 mutations 和相关事件的状态处理.数据结构并没有变化,这就是好的设计,