如果state
是不可改變的,整個狀態是否需要在任何改變時被替換?否則,你在改變狀態。頂級密鑰是作爲單獨的不可變對象保存的嗎?如果狀態是不可變的,那麼整個狀態是否會隨着變化而被替換?
根據定義,不需要更換整件事情? Redux如何處理這個問題?不會取代全狀態中斷PureComponents?
感謝您的任何澄清。
如果state
是不可改變的,整個狀態是否需要在任何改變時被替換?否則,你在改變狀態。頂級密鑰是作爲單獨的不可變對象保存的嗎?如果狀態是不可變的,那麼整個狀態是否會隨着變化而被替換?
根據定義,不需要更換整件事情? Redux如何處理這個問題?不會取代全狀態中斷PureComponents?
感謝您的任何澄清。
讓我們一步打破它一步:
然後,讓我們說你mapStateToProps
有class Square extends PureComponent
爲(store) => { color: store.color }
什麼,現在的情況是,當商店的變化,redux-react
運行mapStateToProps每次。然後它會生成新的道具。這些道具會被髮送來作出反應。
如果你和我在一起,TL; DR如何共同工作就是每當redux存儲區發生變化時,每一個mapStateToProps都會運行,併爲您的反應組件生成新的道具。
從這個時候起,它就是標準的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
都指向,同樣bigData
鍵和其他值不變。不變性部分允許這種事情發揮作用。
在此之後,步驟基本相同。每次更改店鋪後,mapStateToProps
都會運行並生成新的道具對象。終極版-反應,那麼通過新道具物體作出反應,並在這種情況下,PureComponent
不會使,如果道具值具有相同的標識(===
)
注意Redux的反應的有一些PERF優化哪裏就會避免呼籲對新道具作出反應,但爲了討論的目的,我省略了這一步驟。
希望這有助於澄清您的問題。
TL; DR:每個redux操作都會返回一個新的商店。每當生成一個新商店時,mapStateToProps將爲每個反應組件生成新的道具。如果反應組件是pureComponent,它將不會重新渲染,因爲道具沒有改變。
你的問題的癥結是,因爲你的店是不可變的,你可以重複使用在不同的存儲相同的內部對象,甚至是通過mapStateToProps通過那些到你的反應的組分。
謝謝,非常有幫助 – Yeah
如果這是有幫助的考慮upvoting的答案並標記爲正確的:-) @Yeah – AnilRedshift
我試圖upvote,但不能,因爲我的帳戶是新的,對此感到抱歉。 一個後續問題,如果你的action/reducer更新了'foo.bar'並且你連接的組件'mapStateToProps'是'(store)=> {foo:store.foo}',然後通過'foo = {foo }給PureComponent子項。當'foo.bar'發生變化時,孩子不會退縮,對嗎?這就是爲什麼他們建議儘可能保持平坦的原因?再次感謝你 – Yeah
Redux從不說這個狀態是不可改變的。它說構成應用程序的存儲或狀態的減法器應該是不可變的,並且應該是純函數。
是的頂級鍵被單獨認爲是不可變的。
因此,任何更改或Redux術語都會執行任何操作,我們會觸發每個導致狀態更改的操作的縮減器。
那麼,狀態被替換,因爲它是不可變的,但只有減速器的狀態切片。減速器不會重新創建*整個商店*,只是在計算下一個狀態時它是自己的切片。 – Li357