采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
直接对currentBook进行操作,这样会不会破坏vuex这类状态管理使用原则,是对currentBook的直接修改而不是重新提交
嗨,你好,你问了一个非常不错的问题,先说下我的理解:我认为不会破坏 vuex 状态管理原则
从 vuex 的硬规则上来说,只有一条,即:vuex 不允许直接修改 state,如果你直接修改 state 会获得一个报错:
ctx.$store.state = 1 // Error: [vuex] use store.replaceState() to explicit replace store state.
而更新 state 下的状态不会引发错误,所以你说的使用原则实际是我们根据实际业务场景制定的一些规范,制定这些约束的原因是为了:防止多个方法同时更新 state 导致未知的错误,在我们这个项目中,不存在同时更新 currentBook 这个问题,所以不会有问题。
发现你很有思考深度,如果你有更好的见解,欢迎回复交流。
感谢Sam老师的回答
不好意思,之前描述的不够详细,我再具体说一下。关于对象的操作参照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 }
这种写法就可以了
感谢回答!了解不少
同学你好,vuex就是为了解决多组件间数据共享的问题的,现在有很多个组件都会修改或者使用currentBook数据,同时currentBook数据又要在多个组件上同时显示,这个时候用 vuex 来统一管理这些组件的状态,会让逻辑更清晰,更可维护
我知道vuex的共享作用,但是按照规范,vuex的state是不应该直接被修改的,老师在多个组件直接修改currentBook,是不是没按规范走?
同学你好,因为state是实时更新的,mutations无法进行异步操作,而如果直接修改state的话是能够异步操作的,当你异步对state进行操作时,还没执行完,这时候如果state已经在其他地方被修改了,这样就会导致程序存在问题了。所以state要同步操作,通过mutations的方式限制了不允许异步
你不要答非所问,不懂就瞎回答,我想要sam老师的回复
登录后可查看更多问答,登录/注册
Vue全家桶+最新前端技术+前后端分离架构,完整项目流程
2.2k 12
3.6k 10
2.0k 3
1.6k 24
1.5k 23