2017-09-24 3 views
0

特定のコンポーネントの状態をpropsにマップすると、状態が変更されても個々のプロンプトは更新されないようです。状態をコンポーネントにマップすると、(状態が変更されたため)必要な動作が得られます。下記参照。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

私はそれを理解しました!私はその浅い小切手を忘れてしまった。減速機では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が新しいオブジェクトを単独で返したと思ったが、ドキュメントを読んで最初の引数を返すことがわかった。

これは本質的に古典的な変更のバグでした。私は状態オブジェクトのプロパティを上書きし、更新されたプロパティで前の状態を返していました。変更を浅くチェックし、状態オブジェクトへのポインタが変更されていないので、私の状態の更新はmapStateToPropsに登録されていませんでしたが、私のコンポーネントの状態からプロパティに直接アクセスできます。

関連する問題