2017-07-06 78 views
1

如果state是不可改變的,整個狀態是否需要在任何改變時被替換?否則,你在改變狀態。頂級密鑰是作爲單獨的不可變對象保存的嗎?如果狀態是不可變的,那麼整個狀態是否會隨着變化而被替換?

根據定義,不需要更換整件事情? Redux如何處理這個問題?不會取代全狀態中斷PureComponents?

感謝您的任何澄清。

+0

那麼,狀態被替換,因爲它是不可變的,但只有減速器的狀態切片。減速器不會重新創建*整個商店*,只是在計算下一個狀態時它是自己的切片。 – Li357

回答

1

讓我們一步打破它一步:

  1. 有初始Redux的商店{顏色:「紅色」}
  2. 用戶點擊
  3. ,將產生一個動作的按鈕,說CHANGE_COLOR
  4. Redux通過商店(來自步驟1)和操作調用您的減速機。減速機返回一個新的店,說{顏色:「藍」}

然後,讓我們說你mapStateToPropsclass 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是一個不同的對象,但storenewStore都指向,同樣bigData鍵和其他值不變。不變性部分允許這種事情發揮作用。

在此之後,步驟基本相同。每次更改店鋪後,mapStateToProps都會運行並生成新的道具對象。終極版-反應,那麼通過新道具物體作出反應,並在這種情況下,PureComponent不會使,如果道具值具有相同的標識(===

注意Redux的反應的有一些PERF優化哪裏就會避免呼籲對新道具作出反應,但爲了討論的目的,我省略了這一步驟。

希望這有助於澄清您的問題。

TL; DR:每個redux操作都會返回一個新的商店。每當生成一個新商店時,mapStateToProps將爲每個反應組件生成新的道具。如果反應組件是pureComponent,它將不會重新渲染,因爲道具沒有改變。

你的問題的癥結是,因爲你的店是不可變的,你可以重複使用在不同的存儲相同的內部對象,甚至是通過mapStateToProps通過那些到你的反應的組分。

+0

謝謝,非常有幫助 – Yeah

+0

如果這是有幫助的考慮upvoting的答案並標記爲正確的:-) @Yeah – AnilRedshift

+0

我試圖upvote,但不能,因爲我的帳戶是新的,對此感到抱歉。 一個後續問題,如果你的action/reducer更新了'foo.bar'並且你連接的組件'mapStateToProps'是'(store)=> {foo:store.foo}',然後通過'foo = {foo }給PureComponent子項。當'foo.bar'發生變化時,孩子不會退縮,對嗎?這就是爲什麼他們建議儘可能保持平坦的原因?再次感謝你 – Yeah

0

Redux從不說這個狀態是不可改變的。它說構成應用程序的存儲或狀態的減法器應該是不可變的,並且應該是純函數。
是的頂級鍵被單獨認爲是不可變的。
因此,任何更改或Redux術語都會執行任何操作,我們會觸發每個導致狀態更改的操作的縮減器。

相關問題