我具有以下结构
export interface MyStructure {
id: string
values: Array<MyObject>
}
在我的商店中,我有一个调用以下
的操作const ADD_OBJECT= (state: State, action: featureAction.AddObject) => {
const vals= state.entities[action.payload.objId].values;
vals.concat(action.payload.newObj);
return featureAdapter.updateOne({
id: action.payload.routeId,
changes: {
waypoints : [...vals]
},
}, state);
};
但这永远不会更新我的商店...
我也尝试过
changes: {
waypoints : new Array<MyObject>
}
使它起作用的唯一方法是
const ADD_OBJECT= (state: State, action: featureAction.AddObject) => {
const obj = {...state.entities[action.payload.objId]};
obj.values= [...obj .values, ...[action.payload.newObj]];
return featureAdapter.updateOne({
id: action.payload.objId,
changes: obj ,
}, state);
};
但是这太过分了,因为一切都更新了,我不能只更新数组吗?
答案 0 :(得分:0)
此处vals
的变量const vals= state.entities[action.payload.objId].values;
引用State中的对象。因此vals.concat(action.payload.newObj);
使该对象发生突变。
您不应变异状态。
此const obj = {...state.entities[action.payload.objId]};
之所以有效,是因为spreed创建了一个新的Object(新的引用)。然后NgRx将捕获参考更改并更新状态。