老师,课程中一直会从vuex读取currentBook来进行操作,我有个疑问

来源:6-15 阅读器相关知识点总结

慕码人1486145

2020-05-07

直接对currentBook进行操作,这样会不会破坏vuex这类状态管理使用原则,是对currentBook的直接修改而不是重新提交

写回答

3回答

Sam

2020-05-08

嗨,你好,你问了一个非常不错的问题,先说下我的理解:我认为不会破坏 vuex 状态管理原则

从 vuex 的硬规则上来说,只有一条,即:vuex 不允许直接修改 state,如果你直接修改 state 会获得一个报错:

ctx.$store.state = 1
// Error: [vuex] use store.replaceState() to explicit replace store state.

而更新 state 下的状态不会引发错误,所以你说的使用原则实际是我们根据实际业务场景制定的一些规范,制定这些约束的原因是为了:防止多个方法同时更新 state 导致未知的错误,在我们这个项目中,不存在同时更新 currentBook 这个问题,所以不会有问题。

发现你很有思考深度,如果你有更好的见解,欢迎回复交流。

4
1
慕码人1486145
感谢Sam老师的回答
2020-05-09
共1条回复

扬_灵

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 }

这种写法就可以了


3
1
慕码人1486145
感谢回答!了解不少
2020-05-09
共1条回复

扬_灵

2020-05-07

同学你好,vuex就是为了解决多组件间数据共享的问题的,现在有很多个组件都会修改或者使用currentBook数据,同时currentBook数据又要在多个组件上同时显示,这个时候用 vuex 来统一管理这些组件的状态,会让逻辑更清晰,更可维护

0
3
慕码人1486145
回复
扬_灵
你不要答非所问,不懂就瞎回答,我想要sam老师的回复
2020-05-08
共3条回复

Vue 实战商业级读书Web APP完整项目

Vue全家桶+最新前端技术+前后端分离架构,完整项目流程

1610 学习 · 1951 问题

查看课程