Javascript 如果状态是不可变的,那么整个状态是否在任何更改中被替换?
如果Javascript 如果状态是不可变的,那么整个状态是否在任何更改中被替换?,javascript,reactjs,redux,Javascript,Reactjs,Redux,如果状态是不可变的,那么在任何更改中不需要替换整个状态吗?否则,你就是在改变状态。顶级键是否作为独立的不可变对象持有 根据定义,难道不需要任何改变来取代整个东西吗?Redux如何处理这个问题?替换完整状态不会破坏PureComponents吗 感谢您的澄清。让我们一步一步地将其分解: 有一个初始redux存储{color:'red'} 用户单击一个按钮 一个动作被生成,比如说改变颜色 Redux使用存储(从步骤1开始)和操作调用reducer。还原程序返回一个新的存储,比如{color:'blu
状态
是不可变的,那么在任何更改中不需要替换整个状态吗?否则,你就是在改变状态。顶级键是否作为独立的不可变对象持有
根据定义,难道不需要任何改变来取代整个东西吗?Redux如何处理这个问题?替换完整状态不会破坏PureComponents吗
感谢您的澄清。让我们一步一步地将其分解:
类Square扩展了PureComponent
和mapStateToProps
作为(store)=>{color:store.color}
现在发生的是,当存储更改时,redux react
每次都运行MapStateTrops。然后生成新的道具。这些道具被派去反应
如果到目前为止你和我在一起;redux和react如何协同工作的关键在于,每当redux存储发生更改时,每个MapStateTops都会运行,这会为react组件生成新的道具
从这一点上说,这是标准的反应。当React组件的道具更改时,它运行componentWillReceiveProps
,然后运行shouldComponentUpdate
对于一个PureComponent
,基本上这意味着shouldComponentUpdate只需对你的新道具做一个简单的平等性检查,然后就开始了
好的,有了这个基本的理解,嵌套对象的行为类似 如果我们有一个这样的商店,那会怎么样
{
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
都指向相同的bigData
键和其他不变的值。不变性部分允许这种事情发生
之后,步骤基本相同。每次商店更改后,mapstatetops
运行并生成一个新的道具对象。Redux react然后将新的prop对象传递给react,在这种情况下,如果prop值具有相同的标识(==
),则不会呈现PureComponent
)
请注意,redux react有一些性能优化,可以避免使用新的道具调用react,但出于讨论的目的,我省略了这一步
希望这有助于澄清你的问题
TL;DR:每次redux操作都会返回一个新的存储。每次生成新存储时,mapStateToProps都会为每个connect
ed反应组件生成新的道具。如果react组件是pureComponent,则不会重新渲染,因为道具没有更改
您的问题的关键在于,因为您的存储是不可变的,所以您可以在不同的存储中重复使用相同的内部对象,甚至可以通过MapStateTrops将这些对象传递到react组件中。Redux从不说状态是不可变的。它说,构成应用程序的存储或状态的约简应该是不可变的,并且应该是纯函数。
是的,顶级键单独被认为是不可变的。
因此,在任何更改或Redux术语中,任何操作完成后,我们都会在导致状态更改的每个操作上触发一个reducer。好的,状态被替换,因为它是不可变的,但只有reducer的状态片。减速机不重新创建整个商店,只是当计算下一个状态时它是自己的切片。如果这是有用的,考虑一下回答的答案并标记它正确:- YeahI试图投票,但不能,因为我的帐户是新的,很抱歉。在redux中,如果您的操作/还原程序更新了
foo.bar
,并且您连接的组件mapStateToProps
是(store)=>{foo:store.foo}
,然后将foo={foo}
传递给PureComponent子组件,那么还有一个后续问题。当foo.bar
更改时,孩子不会重新启动,对吗?这就是为什么他们建议尽量保持平面?再次感谢你