【发布时间】:2019-01-13 19:13:17
【问题描述】:
在ngrx 中创建reducer 函数时,我读到的所有地方都说我应该返回原始/先前状态的副本。通过使用扩展运算符或使用库或 JSON.parse(JSON.stringify(state)) 之类的技巧。
但我在那里发现了一个问题,但我找不到任何人在谈论它。 reducer 中返回的最后一个状态是与所有当前订阅者和未来订阅者共享的状态。 这意味着使用某个存储的所有组件都将看到相同的状态对象。
这也意味着,如果状态中的任何值在一个组件中发生更改(没有调度操作),商店实际上会修改该值,但不会通知其他组件。 如果要在任何地方共享,那么返回当前状态的副本有什么意义?
不可变一词一直在使用,但这种状态根本不是不可变的,因为存储返回它自己的内部对象,而不是它的副本。
我了解不可变部分是否是开发人员需要遵循的概念。但是,原始对象/值的副本需要在使用它的组件中完成。从 reducer 返回浅拷贝或深拷贝似乎只是浪费处理能力和内存。
【问题讨论】:
-
您不应该改变组件的状态。为了确保这一点,您可以使用类似 ngrx-store-freeze 的东西,如果这样做会引发错误。
-
好的,但是让reducer返回副本有什么意义呢?如果组件不应该直接改变 store 的值,reducer 总是可以操作同一个 state 对象,对我来说增加开销和代码复杂度是没有意义的。
-
我很确定,如果您稍微挖掘一下,您的问题的答案已经得到了足够的时间回答。 “增加开销和代码复杂性对我来说没有意义”这可能是因为您现在不需要 Redux 模式。
-
通过代码复杂性和开销我并不是指 redux 本身,我只是在研究它。我的意思是让减速器返回副本,这对我来说没有意义,正如我在原始问题和我在此处的回复中所解释的那样。在我读到的所有地方,他们都说您应该返回副本以使其不可变,但这并不能使其不可变,这就是我的观点。
-
您创建一个“新”状态是为了创建对该状态的新引用。这样做的好处是可以记住您的选择器,并且您可以将更改检测策略更改为
OnPush。
标签: angular typescript ngrx ngrx-store