在深度嵌套的Redux存储中添加/替换对象

时间:2018-05-28 09:04:29

标签: reactjs redux

我在更新状态树的对象时遇到问题(如果它们不存在则创建缺失的密钥)。我正在使用传播运算符!这是我的行动:

 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
                    }
                }
            }
        };

我编辑了我的代码,我可以到达并在正确的位置放置一个新对象,但它覆盖了前一个!

2 个答案:

答案 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)时,我对要求做了一些修改,但在我的情况下它仍然有效。现在,我可以在没有它们的情况下添加值。谢谢大家的回复。