如果state
是不可变的,那么在任何变化时都需要替换整个州吗?否则,你会改变状态。顶级键是否作为单独的不可变对象保存?
根据定义,任何更改都不需要更换整个东西?这是如何由Redux处理的?不会取代完整的状态中断PureComponents吗?
感谢您的任何澄清。
答案 0 :(得分:1)
让我们一步一步地分解它:
然后,假设您class Square extends PureComponent
mapStateToProps
为(store) => { color: store.color }
现在发生的是,当商店发生变化时,redux-react
每次都会运行mapStateToProps。然后它会生成新的道具。这些道具被送去做出反应。
如果你和我一起到目前为止TL;还原和反应如何协同工作的DR就是每当redux存储发生变化时,每个mapStateToProp都会运行,这会为你的反应组件生成新的道具。
从这一点开始,它是标准的React。当React组件的道具发生变化时,它会运行componentWillReceiveProps
,然后是shouldComponentUpdate
。
对于PureComponent
,基本上这意味着shouldComponentUpdate只对你的新道具进行浅层相等检查,并从那里开始。
好的,通过这种基本理解,嵌套对象的行为类似。
如果我们有这样的商店,那么取代{color: 'red'}
的商店:
{
allMyData: {
color: 'red'
key1: 'someData',
key2: 'lotsMoreData',
bigData: {
nestedKey: 'EvenMoreNestedData',
}
}
然后,您的减速器可能看起来像这样:
const reducer = (store, action) => {
if (action == CHANGE_COLOR) {
let newStore = Object.assign({}, store);
newStore.allMyData = Object.assign({}, newStore.allMyData, { color: 'blue' });
}
}
请注意,有更好的工具可以执行深度不可变合并。我想在此处展示的一个要点是,虽然newStore
是一个不同的对象,但store
和newStore
都指向 SAME {{1} }键和其他未更改的值。不变性部分允许这种事情发挥作用。
此后,步骤基本相同。每次更改商店后,bigData
都会运行并生成一个新的道具对象。 Redux-react然后将新的prop对象传递给React,在这种情况下,如果prop值具有相同的标识(mapStateToProps
)
PureComponent
将不会呈现
请注意,redux-react有一些性能优化,可以避免调用对新道具的反应,但为了讨论的目的,我省略了这一步。
希望这有助于澄清您的问题。
TL; DR:每个redux操作都会返回一个新商店。每次生成新商店时,mapStateToProps都会为每个===
反应组件生成新的道具。如果react组件是pureComponent,它将不会重新渲染,因为props没有更改。
您的问题的关键在于,因为您的商店是不可变的,您可以在不同商店中重复使用相同的内部对象,甚至可以通过mapStateToProps将那些传递到您的反应组件中。
答案 1 :(得分:0)
Redux从不说国家是不可改变的。它说构成应用程序的存储或状态的reducer应该是不可变的,并且应该是纯函数 是的,顶级密钥被单独认为是不可变的 因此,在任何更改或Redux术语中,任何操作都会完成,我们会在每个操作上触发一个导致状态更改的缩减器。