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
确实是一个丑陋的例子