Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Redux Reducer-如何在不改变状态的情况下更新对象值?_Javascript_Reactjs_Redux_Immutability_Reducers - Fatal编程技术网

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

Javascript Redux Reducer-如何在不改变状态的情况下更新对象值?,javascript,reactjs,redux,immutability,reducers,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, sc

我的减速机是这样的:

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

上面的方法会起作用,但这要求我始终了解数据结构,因此,如果我将来向其中添加其他内容,我需要记住返回到这个减缩器并将其添加回,这样我就不会丢失它

有没有更好的方法来实现这一点

编辑:感谢Vijay对多个对象分配的建议。我最终让它用这个来工作:

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

怎么样?如果有任何改进,请告诉我。

Multiple Object.assign可能有帮助:

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

多个
对象。分配
方法看起来很难看

你可以做:

return { ...state.action.player, cards: action.cards }
注意:您需要
stage-2
babel预设才能使用此功能


<> P>一旦更新的数据结构变得相当复杂,您可以使用“S代码> SETIN < /COD>,<代码> UPDATEIN < /Cord>方法进行深度更新。

可以考虑IsMababel.js和Read on Nebe的本土化:您使用的是巴贝尔吗?您是否启用了第二阶段的预设功能?谢谢。我编辑了我的答案,以反映我根据您的答案提出的新解决方案。你觉得怎么样?
Object.assign
确实是一个丑陋的例子