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

时间:2016-08-18 02:39:45

标签: javascript reactjs redux immutability reducers

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

  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但其中一条规则是从不改变状态

上面的方法会起作用,但这需要我总是知道数据结构,所以如果我将来添加其他内容,我需要记得回到这个reducer并将其添加回来,所以我不知道不会失去它。

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

修改:感谢Vijay提出多个对象分配的建议。我最终得到了这个:

case 'UPDATE_PLAYERS_CARDS':
  const playerObject = Object.assign(state[action.player], { cards: action.cards });
  return Object.assign({}, state, {
    [action.player]: playerObject
  });
那是怎么回事?如果我有任何改进,请告诉我。

2 个答案:

答案 0 :(得分:6)

多个Object.assign方法看起来很难看。

你可以这样做:

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

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

一旦要更新的数据结构变得相当复杂,您可以使用ImmutableJSsetInupdateIn方法轻松进行深度更新

答案 1 :(得分:1)

多个Object.assign可能会有所帮助:

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