老师,课程中一直会从vuex读取currentBook来进行操作,我有个疑问
来源:6-15 阅读器相关知识点总结
慕码人1486145
2020-05-07
直接对currentBook进行操作,这样会不会破坏vuex这类状态管理使用原则,是对currentBook的直接修改而不是重新提交
3回答
-
嗨,你好,你问了一个非常不错的问题,先说下我的理解:我认为不会破坏 vuex 状态管理原则
从 vuex 的硬规则上来说,只有一条,即:vuex 不允许直接修改 state,如果你直接修改 state 会获得一个报错:
ctx.$store.state = 1 // Error: [vuex] use store.replaceState() to explicit replace store state.
而更新 state 下的状态不会引发错误,所以你说的使用原则实际是我们根据实际业务场景制定的一些规范,制定这些约束的原因是为了:防止多个方法同时更新 state 导致未知的错误,在我们这个项目中,不存在同时更新 currentBook 这个问题,所以不会有问题。
发现你很有思考深度,如果你有更好的见解,欢迎回复交流。
412020-05-09 -
扬_灵
2020-05-08
不好意思,之前描述的不够详细,我再具体说一下。关于对象的操作参照vuex官网的最佳实践:
1. 最好提前在store中初始化好所有需要的属性。
2. 当需要在对象上添加新属性时,你应该使用Vue.set(obj,'newProd',123),或者以新对象替换老对象,例如state.obj={...state.obj,newProd:123}
3. 更改vuex的store中状态的唯一方法是提交mutation。
针对这些我们在看看在视频中对于currentBook的操作,在视频中我们操作的currentBook是一个对象,需要修改的是currentBook某个现有的属性,而不是currentBook本身,并没有命中上述的最佳实践,vuex的核心规则是不能直接更新state,而不是不能更新state下的属性,所以这种用法是没有问题的。
如果你的业务中需要创建新对象,不覆盖原有对象属性,可以使用
state.currentBook = { ...state.currentBook, newProp: 123 }
这种写法就可以了
312020-05-09 -
扬_灵
2020-05-07
同学你好,vuex就是为了解决多组件间数据共享的问题的,现在有很多个组件都会修改或者使用currentBook数据,同时currentBook数据又要在多个组件上同时显示,这个时候用 vuex 来统一管理这些组件的状态,会让逻辑更清晰,更可维护
032020-05-08
相似问题