我在更新状态树的对象时遇到问题(如果它们不存在则创建缺失的密钥)。我正在使用传播运算符!这是我的行动:
export function addResourceOption(value) {
return function (dispatch) {
dispatch(addRsrcOpt(value))
}
};
我从操作中获取“value”,我使用的是当前状态值(selectedResource,resourceSubName,selectedResourceOption)。这是我访问状态树的方式:
state: {
physical_machines:{
state.selectedResource:{
state.enteredSubResourceName:{ "name": state.selectedResourceOption, "value": action.payload.value}
所以我收到错误:无法读取undefined的“enteredSubResourceName”。这是我的reducer代码:
case ADD_RESOURCE_OPTION:
return {
...state,
//resourcesOptionsTable: [...state.resourcesOptionsTable, { name: action.payload.name, value: action.payload.value }],
physical_machines:{
...state.physical_machines,
[state.selectedResource]:{
...state.physical_machines.selectedResource,
[state.enteredSubResourceName]:{
//...state.physical_machines.selectedResource[state.enteredSubResourceName],
[state.selectedResourceOption] : action.payload.value
}
}
}
};
我编辑了我的代码,我可以到达并在正确的位置放置一个新对象,但它覆盖了前一个!
答案 0 :(得分:0)
我不太确定,但你能看一下并测试一下这个:
case ADD_RESOURCE_OPTION:
return {
...state,
physical_machines:{
...state.physical_machines,
state.selectedResource:{
...state.physical_machines.selectedResource,
state.enteredSubResourceName:{
...state.physical_machines.selectedResource.enteredSubResourceName,
selectedResourceOption : action.payload.value
}
}
}
};
答案 1 :(得分:0)
所以,我设法使用这个reducer代码来解决问题:
let { selectedResource, enteredSubResourceName, selectedResourceOption } = state
return Object.assign({}, state, {
physical_machines: {
...state.physical_machines,
[selectedResource + "." + enteredSubResourceName]:{
...state.physical_machines[selectedResource + "." + enteredSubResourceName],
[state.selectedResourceOption.name] : action.payload.value
}
}
});
当我加入(selectedResource +“。”+ enteredSubResourceName)时,我对要求做了一些修改,但在我的情况下它仍然有效。现在,我可以在没有它们的情况下添加值。谢谢大家的回复。