Redux Reducer - 如何在不改变状态的情况下更新对象值?

Dre*_*rew 2 javascript immutability reducers reactjs redux

我的减速机看起来像这样:

  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
Run Code Online (Sandbox Code Playgroud)

基本上,我只想更新球员卡,但如果我不包括名称和分数,那么这些将在新状态下被删除.

理想情况下,我需要做这样的事情:state[action.player].cards = action.cards 但其中一条规则是永远不要改变状态.

上面的方法可行,但这需要我总是知道数据结构,所以如果我将来添加其他东西,我需要记得回到这个reducer并重新添加,所以我不会丢失它.

有没有更好的方法来实现这一目标?

编辑:感谢Vijay提出多个对象分配的建议.我最终得到了这个:

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

那个怎么样?如果我能做出任何改进,请告诉我.

Ash*_*ary 6

多种Object.assign方法看起来很难看.

你可以做:

return { ...state.action.player, cards: action.cards }
Run Code Online (Sandbox Code Playgroud)

注意:您需要stage-2使用babel预设才能使用此功能.

一旦数据结构更新变得相当复杂,你可以使用ImmutableJSsetIn,updateIn方法做深更新容易.