我试图了解Redux中实际使用的变量(如果有的话)。我发现的每个教程/文章/文档都指出reducers永远不应该改变状态对象,而是创建一个更改数据的新副本(即reducers必须是纯函数)。我理解这一点,但我找不到任何解释本指南如何实际由Redux内部实现使用的地方。
这只是一个强烈的推荐,或者如果我让Reducer不纯,那么Redux内部的东西会破坏吗?
如果是晚些时候究竟会破坏什么?
我确实找到了几个地方Dan说,在一些(非常罕见的)情况下,减速器可能是非纯的,但它有风险(再次,没有解释究竟是什么风险)。
答案 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返回的状态。