2016-08-18 17 views
2

私の減速は、次のようになります。Redux Reducer - 状態を変更せずにオブジェクト値を更新するには?

const players = (state = {}, action) => { 
    switch (action.type) { 
     case 'UPDATE_PLAYERS_CARDS': 
     return Object.assign({}, state, { 
      [action.player]: { 
      name: state[action.player].name, 
      score: state[action.player].score, 
      cards: action.cards 
      } 
     }) 
     default: 
     return state 
    } 
    } 

    export default players 

基本的に、私は選手カードを更新したいが、私は名前とスコアが含まれていない場合は、それらを新しい状態に削除されます。

理想的に私はちょうどこのような何かをする必要があります:state[action.player].cards = action.cardsしかし、規則の1つは、を決してに変更することです。

上記の方法はうまくいきますが、データ構造を常に知っている必要がありますので、今後別のものを追加する場合は、このレデューサーに戻ってそれを追加してくださいそれを失わないでください。

これを実行するより良い方法はありますか?

編集:複数のオブジェクト割り当てに関する提案のためにVijayに感謝します。私はこれでうまくいくようになりました。

case 'UPDATE_PLAYERS_CARDS': 
    const playerObject = Object.assign(state[action.player], { cards: action.cards }); 
    return Object.assign({}, state, { 
    [action.player]: playerObject 
    }); 

これはどうですか?私ができる改善があれば教えてください。

+0

リアクションのネイティブでimmutable.jsとreadupが使用されている可能性があります。https://facebook.github.io/react/docs/update.html – dandavis

+0

バーベルを使用していますか?あなたは 'stage-2'プリセットを有効にしていますか?ありがとうVijay。 – QoP

答えて

1

複数Object.assignは役立つかもしれない:Object.assign方法は醜い

const newState = Object.assign({}, state); 
Object.assign(newState.action.player, { cards: action.cards }); 
+0

あなたの答えから生まれた新しいソリューションを反映させるために私の答えを編集しました。あなたはそれをどう思いますか? – Drew

4

複数。

あなたが行うことができます。

return { ...state.action.player, cards: action.cards } 

注:あなたはこれを使用するプリセットstage-2バベルが必要になります。更新するデータ構造がかなり複雑になると

、あなたは深いアップデート簡単に行うためにImmutableJSsetInupdateInメソッドを使用することができます。

+1

'Object.assign'は真に1つの醜いmfです – Tuna

関連する問題