请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

直接对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 这个问题,所以不会有问题。

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

4 回复 有任何疑惑可以回复我~
  • 提问者 慕码人1486145 #1
    感谢Sam老师的回答
    回复 有任何疑惑可以回复我~ 2020-05-09 10:22:15
扬_灵 2020-05-08 21:18:36

不好意思,之前描述的不够详细,我再具体说一下。关于对象的操作参照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 回复 有任何疑惑可以回复我~
  • 提问者 慕码人1486145 #1
    感谢回答!了解不少
    回复 有任何疑惑可以回复我~ 2020-05-09 10:22:55
扬_灵 2020-05-07 17:18:12

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

0 回复 有任何疑惑可以回复我~
  • 提问者 慕码人1486145 #1
    我知道vuex的共享作用,但是按照规范,vuex的state是不应该直接被修改的,老师在多个组件直接修改currentBook,是不是没按规范走?
    回复 有任何疑惑可以回复我~ 2020-05-07 22:23:44
  • 扬_灵 回复 提问者 慕码人1486145 #2
    同学你好,因为state是实时更新的,mutations无法进行异步操作,而如果直接修改state的话是能够异步操作的,当你异步对state进行操作时,还没执行完,这时候如果state已经在其他地方被修改了,这样就会导致程序存在问题了。所以state要同步操作,通过mutations的方式限制了不允许异步
    回复 有任何疑惑可以回复我~ 2020-05-08 09:26:22
  • 提问者 慕码人1486145 回复 扬_灵 #3
    你不要答非所问,不懂就瞎回答,我想要sam老师的回复
    回复 有任何疑惑可以回复我~ 2020-05-08 09:49:42
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信