更新列表中对象的字段

时间:2017-01-05 07:53:24

标签: reactjs redux react-redux

我有一个道具是一个对象列表。我的reducer用于更新对象的某个字段并将其附加到列表中,要更新的值是通过action.payload(这是商店的另一个支柱)提供的。

我知道只需在列表中添加对象,我就可以像这样使用扩展运算符

function myReducer(state=[],action){
    case something:
        return [...state,action.payload];
    case default:
        return state;
}

但是说我有一个更改action.payload.aCertainField,然后将其附加到对象列表中。当我做这样的事情时:

action.payload.aCertainField = aCertainValue;
return [...state,action.payload];

但它实际上也改变了其他道具aCertainField。我不要那个。有解决方案吗?

1 个答案:

答案 0 :(得分:1)

您可以使用ES6执行以下操作:

let { aCertainField, id } = action.payload.obj;

//find the index of object in that array hoping the id is unique for the object
let indexOfObject = state.findIndex( (item) => item.id === id );

let actualObject = Object.assign({}, state[indexOfObject], { aCertainField });

return [
  ...state.slice(0, indexOfObject),
  actualObject,
  ...state.slice(indexOfObject+1)
]

注意:认为id是对象结构的唯一键,aCertainField是要更新的值