我的减速机看起来像这样:
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
});
那是怎么回事?如果我有任何改进,请告诉我。
答案 0 :(得分:6)
多个Object.assign
方法看起来很难看。
你可以这样做:
return { ...state.action.player, cards: action.cards }
注意:您需要stage-2
babel预设才能使用此功能。
一旦要更新的数据结构变得相当复杂,您可以使用ImmutableJS的setIn
,updateIn
方法轻松进行深度更新。
答案 1 :(得分:1)
多个Object.assign可能会有所帮助:
const newState = Object.assign({}, state);
Object.assign(newState.action.player, { cards: action.cards });