2017-09-24 55 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中注册,但我可以直接从组件中的状态访问属性。