2017-12-17 10 views
3

私は減速機を持っており、statearrayの1アイテムを更新しようとしています。これは次のようになります。reduxと州の1アイテムを更新するには?

const players = (state = [{name:'John',nrGames:0,nrWins:0},{name:'Ed',nrGames:0,nrWins:0},{name:'Mark',nrGames:0,nrWins:0}], action) => { 
    switch (action.type) { 

     case 'ADD_PLAYER': 
      return [...state,{name:action.name}] 

     case 'ADD_WIN': 
      return [...state, action.name == 'bla' ? {nrWins:10} : {} ] 

     default: 
      return state; 
    } 
}; 

export default players; 

特定の名前のnrWinsプロパティを変更する方法を理解しようとしています。したがって、ADD_WINがname = 'John'でディスパッチされたときに、Johnオブジェクトを更新するだけでなく、nrWinsプロパティを1の状態にして、状態の他のオブジェクトを更新しないようにする方法はありますか?

答えて

3

プレイヤーには.mapが必要です。アクションが見つかると、更新された勝ち数で新しいプレーヤーが作成されます。読みやすくするために、incWinForPlayerという関数を作成しました。

const incWinForPlayer = (name) => (player) => { 
    return player.name === name 
    ? {...player, nrWins: player.nrWins + 1} 
    : player 
}; 

const players = (state, action) => { 
    switch (action.type) { 
    case 'ADD_PLAYER': 
     return [...state, {name: action.name}] 
    case 'ADD_WIN': 
     return state.map(incWinForPlayer(action.name)); 
    default: 
     return state; 
    } 
}; 

export default players; 
0

「推奨」のアプローチはスライスに新しい項目までの古い配列され、修正1でそれをCONCAT、配列の残りの部分とそれをCONCAT。

アクションが新しい項目全体と修正するインデックスを返すことを確認します。

ような何か:

case 'ADD_WIN': 
    return [ 
    ...array.slice(0, action.index), 
    action.item, 
    ...array.slice(action.index) 
    ]; 

編集1:ソースhttps://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html#inserting-and-removing-items-in-arrays

関連する問題