Javascript 对象的2级嵌套数组的设置状态
我有这个对象数组<代码>控制台.log(this.state.zones)将打印Javascript 对象的2级嵌套数组的设置状态,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我有这个对象数组控制台.log(this.state.zones)将打印 [ { "name": "Zone 1", "cameras": [] }, { "name": "Zone 2", "cameras": [ { "device_id": 123, "entrance_name": "East Gate", "name": "SA-PCS-010", } ] }
[
{
"name": "Zone 1",
"cameras": []
},
{
"name": "Zone 2",
"cameras": [
{
"device_id": 123,
"entrance_name": "East Gate",
"name": "SA-PCS-010",
}
]
}
]
我想添加一个checked属性,其值为true或false,我在下面尝试了
this.setState({
zones: [{
...this.state.zones,
cameras: [{
...this.state.zones[this.state.selectedZoneOnMenu].cameras.map(
o => ({...o, checked: o.device_id === camera_id ? true : false
})
)
}]
}]
})
假设
此.state.selectedZoneOnMenu
为1,而摄像机id
为“设备id”
为123,为什么上述设置状态失败?重新渲染时,我收到未定义摄影机的错误。您使用的状态设置不正确,因为扩展运算符语法不在正确的位置。试试这个
this.setState({
zones: [ ...this.state.zones.slice(0, this.state.selectedZoneOnMenu), {
...this.state.zones[this.state.selectedZoneOnMenu],
cameras: [
...this.state.zones[this.state.selectedZoneOnMenu].cameras.map(
o => ({...o, checked: o.id === camera_id ? true : false
})
)]
}, ...this.state.zones.slice(this.state.selectedZoneOnMenu + 1)]
})
但是,您的状态是深度嵌套的,您可以为您的状态使用,或者使用您可以使用functional
setState
来防止变异,而且在我看来,您的代码更易于阅读
示例
this.setState((prevState) => {
const zones = Object.assign({}, prevState.zones);
const { selectedZoneOnMenu } = prevState;
zones[selectedZoneOnMenu].cameras = zones[selectedZoneOnMenu].cameras.map((camera) => (
Object.assign({}, camera, { checked: (camera.device_id === camera_id) })
));
return { zones };
});
对于嵌套状态,最好使用ImmutableJS。您的代码将非常清楚为什么在这里使用slice?我不明白。特别是此处需要this.state.selectedZoneOnMenu+1许可证,因为您只想修改数组的一个元素,所以在此之前和之后保持另一个对象不变,并替换要修改的对象