javascript - 更新状态反应
问题描述
下图表示具有两个 ui 控件的对象,这些控件存储为 this.state.controls
最初 statesValue 值是通过在 componentDidMount 之前接收到的数据设置的,一切都很好。然而,对每个控件 statesValues 的更新是通过一个事件发送的,该事件由以下函数处理
const handleValueStateChange = event => {
let controls = Object.entries(this.state.controls);
for (let cont of controls) {
let states = cont[1].states;
if (states) {
let state = Object.entries(states);
for (let [stateId, contUuid] of state) {
if (contUuid === event.uuid) {
cont[1].statesValue[stateId] = event.value;
}
}
}
}
};
它愉快地更新了值,但是请记住更改的更新值是 this.state.controls 的子集,我不知道如何使用 this.setState 来更新已更改的值。
提前感谢您的任何指点
解决方案
问题是您正在更新一个已从原始结构更改的对象(通过使用Object.entries
)。您仍然可以以相同的方式进行迭代,但是您需要更新一个保持原始结构的对象。尝试这个:
制作对象的副本controls
。更新该对象。将其替换为state
.
const handleValueStateChange = event => {
// copy controls object
const { controls } = this.state;
let _controls = Object.entries(controls);
for (let cont of _controls) {
let states = cont[1].states;
if (states) {
let state = Object.entries(states);
for (let [stateId, contUuid] of state) {
if (contUuid === event.uuid) {
// update controls object
controls[cont[0]].statesValue[stateId] = event.value;
}
}
}
}
}
// replace object in state
this.setState({controls});
};
推荐阅读
- sql - T-SQL - 合并两个表而不创建临时表
- javascript - React Native,一个按钮,每次点击三个名称
- python - PyQt5:如何调整主窗口大小以适应 Stackedwidget 或 Stackedlayout
- amazon-web-services - AWS - 是否可以将参数从 AWS lambda 函数传递到 AWS sagemaker notebook
- docker - Docker容器中的Spark不读取Kafka输入-结构化流
- java - 是否可以使 Spring MVC Web 应用程序作为嵌入 Java 和 Tomcat 的“独立可执行文件”运行?
- c# - 如何从 Azure 服务总线主题订阅一次接收 N 条消息
- r - 使用条件在 r 中创建组合列表
- javascript - 将值重新分配给对象属性时出错
- bash - 在网络驱动器组/用户名中获取 acl 而不是 SID