javascript - 反应状态 - 更新嵌套数组中对象的属性
问题描述
我有一个 React 应用程序,其界面允许用户选择日期和时间段。我有一个维护状态的顶级对象,它可能如下所示:
this.state = {
days: [{
date: '12-13-2022',
time_slots: [{
start: '10 am',
end: '11 am',
selected: false
},{
start: '1 pm',
end: '3 pm',
selected: false
}]
}, {
date: '12-14-2022',
time_slots: [{
start: '10 am',
end: '11 am',
selected: false
}
}]
}
当用户单击时隙时,我想将selected
属性更新为true
.
到目前为止,我有这个,但我认为我正在改变状态,这是不好的做法。
slotClicked(day_index, slot_index) {
let state = this.state.days[day_index].time_slots[slot_index].selected = true;
this.setState({state});
}
我如何以有效(就重新渲染而言)和不可变的方式更新状态?
解决方案
与其他答案相反,您必须深度克隆您的阵列:
slotClicked(day_index, slot_index) {
// If you prefer you can use lodash method _.cloneDeep()
const newDays = JSON.parse(JSON.stringify(this.state.days));
newDays[day_index].time_slots[slot_index].selected = true;
this.setState({days: newDays});
}
如果您不深度克隆您的数组,则该time_slots
数组将通过引用复制并对其进行突变,它将使原始数组的状态发生突变。
推荐阅读
- vue.js - 浅层安装组件时无法定位 v-btn
- c# - 如何使用嵌入式 WPF UserControl(从 Excel VSTO 加载项的功能区实例化)从 WinForm 处理 Windows 缩放?
- bash - 尝试发送几个文件时出现 if 循环问题
- android - Flutter - 收到通知时更改应用栏图标
- hibernate - 使用 schema.sql 和 DDL 自动生成的 Spring Boot 初始化?
- docker - 无法弄清楚我是如何错误配置我的 docker-compose 文件的
- vba - 使用 Vlookup 发送电子邮件以匹配电子邮件地址
- c++ - 如何让 QString 在 QT 中具有特定的大小?
- android - 如何修复 kivy plyer vibrate android test apk 中的“jnius.jnius.JavaException”(使用 buildozer 编译)
- powershell - 快速将 PDF 文档附加(合并)到 50,000 个其他文档中