Redux 的 .getState() return 不应该是状态 object 的副本吗?

Shouldn't Redux's .getState() return a copy of the state object?

我目前正在潜入 Redux 领域,自从我了解 reducer 的概念是多么简单以来,我不得不说我真的很兴奋。

然而,我在标题中提出的问题让我觉得很奇怪。

由于状态 object 的不变性是 Redux 的核心支柱,.getState() 方法 return 不应该是 currentState 的副本,这样它不暴露在环境中,因此不可能变异它?

我认为您混淆了商店及其包含的状态与组件的状态。 它们是两个不同的概念。 当您调用 getState() 时,您将获得 "this" 组件的状态;显然你不应该修改它;但是您可以使用 setState() 修改它,这会触发组件的重绘。 相反,当您在 reducer 中并且操作导致 reducer 更改状态时,返回的状态必须始终是新对象。

这里有两个原因:1) 在一个合适的 Redux 应用程序中,你永远不应该尝试直接改变 State,所以 getState() 结果只能通过 getter 使用,所以没有必要浪费时间和周期关于复制; 2)实际上,要以正确的方式复制它并不是那么容易。引用corresponding issue的相关讨论:

You'd have to due a deep object assign to truely destroy all references and we wouldn't want to do that, as you wouldn't be able to compare if a particular part of your state tree changed, which is incredibly useful in React via shouldComponentUpdate.

不过,人们可能会认为在检索到的状态上使用 Object.freeze() 作为一种保护措施(防止在其他地方改变此类对象)是有益的。然而,过多地传递结果状态很少是一个好的模式(如 中所述)。