如何在Redux中实际使用状态不变性?

时间:2016-03-13 12:56:42

标签: immutability redux

我试图了解Redux中实际使用的变量(如果有的话)。我发现的每个教程/文章/文档都指出reducers永远不应该改变状态对象,而是创建一个更改数据的新副本(即reducers必须是纯函数)。我理解这一点,但我找不到任何解释本指南如何实际由Redux内部实现使用的地方。

这只是一个强烈的推荐,或者如果我让Reducer不纯,那么Redux内部的东西会破坏吗?

如果是晚些时候究竟会破坏什么?

我确实找到了几个地方Dan说,在一些(非常罕见的)情况下,减速器可能是非纯的,但它有风险(再次,没有解释究竟是什么风险)。

1 个答案:

答案 0 :(得分:4)

Redux与React一起使用时,通常使用connect中的react-redux进行连接。使用connect包装组件,使其通过指定更改处理程序来订阅对redux存储的更改,该更改处理程序在调度操作并调用reducers之后调用。在调用更改处理程序时,connect使用标识比较(previousState !== newState)将商店的当前状态与新状态进行比较 - 这比进行浅或深比较更快 - 并且仅在两者之间状态不相同,是否使用setState更新包装的组件。直接改变状态不会导致引用发生更改,从而导致包装组件不重新呈现。

connect确定是否应该调用setState:

if (!pure || prevStoreState !== storeState) {
  this.hasStoreStateChanged = true
  this.setState({ storeState })
}

connect还提供了一个选项,通过使用以下命令指定包装的组件不纯,来覆盖此行为:

connect(mapStateToProps, mapDispatchToProps, mergeProps, {pure: false} )

纯组件也通过实施shouldComponentUpdate来使用身份比较,以防止对render进行不必要的调用。

TL; DR:如果商店的状态因突变而发生变化,则connect包裹的组件将不会重新呈现。

编辑:Redux本身的任何内容都不会破​​坏,因为它非常小,不会尝试检查reducers返回的状态。