2017-09-24 59 views
0

當我將狀態映射到特定組件的道具時,即使狀態已更改,單個道具似乎也不會更新。當我將整個狀態映射到組件時,我會得到我想要的行爲(因爲狀態已更改)。見下文。React-Redux:mapStateToProps不用個別屬性更新,但在映射整個狀態/商店時確實連接

const Dashboard = ({ state, justMarkets, justItems }) => { 
    console.log('state', state); 
    console.log('state markets', state.markets); 
    console.log('just markets', justMarkets); 

    console.log('state items', state.items); 
    console.log('justItems', justItems) 
    const markets = state.markets, 
     items = state.items; 
    return (
    <div> 
     { 
     markets 
      .filter(market => market.hasItems) 
      .map(market => { 
       const { 
        marketname: name, 
        id, 
        Products, 
        Address, 
        GoogleLink 
       } = market; 

       return (
        <div className="market" key={id}> 
         <div> 
         <h1>{name}</h1> 
         <h2>{Address}</h2> 
         <a href={GoogleLink} target="_blank">View in Google Maps</a> 
         </div> 
         <Items items={items} products={Products} /> 
        </div> 
       ); 
      }) 
     } 
     </div> 
    ); 
}; 

const mapStateToProps = state => ({ 
    state, 
    justMarkets: state.markets, 
    justItems: state.items 
}); 
export default connect(mapStateToProps, null)(Dashboard); 

如果你看到這個image,你會發現,當狀態更新時,我只能從組件內的state.marketsstate.items訪問更新狀態。我似乎無法直接在mapStateToProps中訪問它們(狀態更新後,justMarketsjustItems仍爲空陣列)。希望對此事有所瞭解!

+0

看起來很奇怪。你有可能在別的地方不小心覆蓋道具嗎?我的意思是,如果你出於某種原因有類似於''的代碼。 – jonahe

+0

我想通了!我忘記了這個簡單的檢查。在reducer中,我已經返回Object.assign(state,newPropObj)而不是Object.assign({},state,newPropObj),所以在技術上它就好像指向狀態對象的指針從未改變過。感謝您的幫助! – Jai

+0

哦,我明白了。整蠱!很高興你發現了錯誤!我建議您將其發佈爲答案,並且(48小時後)接受您自己的答案,供將來的讀者閱讀。 https://stackoverflow.com/help/self-answer – jonahe

回答

1

想通了!問題實際上是在減速器中。在減速,我寫的代碼爲:

return Object.assign(state, action.propObj) 

時,它應該是

return Object.assign({}, state, action.propObj) 

啊,語義。我認爲Object.assign自己返回了一個新對象,但是在閱讀過文檔後,我現在知道它返回第一個參數。

所以這本質上是一個經典的可變性錯誤。我覆蓋了狀態對象的屬性,並返回了更新屬性的前一個狀態。由於redux淺查看更改和指向狀態對象的指針沒有更改,我的狀態更新沒有在mapStateToProps中註冊,但我可以直接從組件中的狀態訪問屬性。