Reactjs 使用对象rest删除嵌套对象
我有一个react应用程序,其中包含一些redux状态,如下所示:Reactjs 使用对象rest删除嵌套对象,reactjs,ecmascript-6,redux,ecmascript-next,Reactjs,Ecmascript 6,Redux,Ecmascript Next,我有一个react应用程序,其中包含一些redux状态,如下所示: { shape1: { constraints: { constraint1: { key: value }, constraint2: { key: value } } }, shape2: {
{
shape1: {
constraints: {
constraint1: {
key: value
},
constraint2: {
key: value
}
}
},
shape2: {
constraints: {
constraint1: {
key: value
},
constraint2: {
key: value
}
}
}
}
我分派了一个动作,并希望删除其中一个约束对象,即shape1的constraint1。下面是此操作的减速器的外观,假设我正在尝试从shape1中删除constraint1:
case DELETE_CONSTRAINT:
shape = action.payload; // ie. shape1, the parent of the constraint I
// am trying to delete
let {
[shape]: {'constraints':
{'constraint1': deletedItem}
}, ...newState
} = state;
return newState;
这将从状态中删除整个shape1对象,而不仅仅是单个constraint1对象。我哪里出了问题/这样做的最佳方法是什么?为了与代码的其余部分保持一致,我更喜欢使用对象rest
谢谢 简而言之,不使用对象-不使用spread操作符 但是,您可以通过其他方式进行操作,而无需改变您的状态,例如过滤器,例如:
return state.filter((element, key) => key !== action.payload);
一致性旁注
作为旁注——方法和风格的一致性与实际代码的一致性之间存在巨大差异。如果换一种方式更合乎逻辑,那么就不要觉得有必要为一致性而吹嘘。如果它真的破坏了其他开发人员正在开发的应用程序的一致性,请记录它的不同之处 当在分解结构中使用rest语法来获取对象的一部分时,您将在相同的“级别”上获取其他所有内容 在这种情况下,newState接受一切,而不是
[shape]
由于您的状态有多个嵌套级别,因此必须使用destructuring和rest语法提取新约束,然后创建一个新状态
const state={
形状1:{
限制条件:{
约束1:{
关键字:“值”
},
约束2:{
关键字:“值”
}
}
},
形状2:{
限制条件:{
约束1:{
关键字:“值”
},
约束2:{
关键字:“值”
}
}
}
};
常量形状='shape1';
const constraint='constraint1';
//提取约束
常数{
[形状]:{
限制条件:{
[约束]:删除,
…限制条件
}
}
}=国家;
//创建下一个状态
常数newState={
……国家,
[形状]:{
…state[shape],//如果shape只包含约束,则继续跳过此操作
约束条件
}
}
console.log(newState)代码>
let {
[shape]: {'constraints':
{'constraint1': deletedItem}
}, ...newState
} = state;