javascript - 为什么当我设置状态时我的 React Hook 没有更新?
问题描述
我正在使用 react useState
,其中状态是具有一些嵌套属性的对象。当我调用setState
它时,我没有看到重新渲染或状态正在更新。我假设反应看到新状态等于旧状态,因此不会发生更新。所以,我已经尝试先克隆状态,但仍然没有看到任何更新。
我怎样才能让这个函数导致状态更新?
export type TermEditorStateRecord = {
term: SolrTermType;
state: SolrTermEditorRecordState;
classifications: { [key: string]: string };
};
export type TermEditorStateRecordMap = {
[phrase: string]: TermEditorStateRecord;
};
const [records, setRecords] = useState({});
const setRecordClassification = (label, key, value) => {
const cloned = new Object(records) as TermEditorStateRecordMap;
cloned[label].classifications[key] = value;
setRecords(cloned);
};
对于 TypeScript 类型,我深表歉意,但我已将它们包含在此处,以便您可以看到预期的状态形状。
是不是因为变化嵌套太深而没有更新?有没有办法让它工作,还是我需要以某种方式将改变的状态拉到它自己的状态?
解决方案
new Object
不会进行深层复制,因此因为setRecords
它是同一个实例并且不会触发重新渲染,
const obj = {
a: {
b: "b"
}
};
const copy = new Object(obj);
copy["c"] = "c";
console.log(obj);
您需要手动更新嵌套属性:
const setRecordClassification = (label, key, value) => {
setRecords(record => ({
...record,
[label]: {
...record[label],
classifications: {
...record[label].classifications,
[key]: value
}
}
}));
};
或创建一个副本,使用:
const cloned = JSON.parse(JSON.stringify(record));
cloned[label].classifications[key] = value;
setRecords(cloned);
推荐阅读
- laravel - 如何根据选择的下拉菜单显示特定类别
- python - 闲置3秒后如何再次移动一圈?
- azure - 上传文件的MD5值
- javascript - 在节点js中调用函数内部的函数
- excel - Excel宏:如何在循环到文档表而不是页面时获取字头
- testing - 使用 pressKey 模拟 typeText 不会产生预期的结果
- php - Codeigniter - 创建唯一的页面查看计数器
- c++ - 显示用户输入的平均数大于 50 和所有数字的乘积可被 3 整除
- java - org.openqa.selenium.InvalidSelectorException: 无效选择器 SyntaxError: Unexpected token } 通过 Selenium Java 使用 XPath
- vb.net - 在 VB.Net 函数中编写较短的交集