Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么不是';当我设置状态时,我的钩子不会更新吗?_Javascript_Reactjs_Typescript_React Hooks - Fatal编程技术网

Javascript 为什么不是';当我设置状态时,我的钩子不会更新吗?

Javascript 为什么不是';当我设置状态时,我的钩子不会更新吗?,javascript,reactjs,typescript,react-hooks,Javascript,Reactjs,Typescript,React Hooks,我正在使用reactuseState,其中状态是一个具有一些嵌套属性的对象。当我对其调用setState时,我没有看到重新渲染或状态正在更新。我假设react看到新状态等于旧状态,因此不会发生更新。因此,我尝试先克隆状态,但仍然没有看到任何更新 如何使此函数导致状态更新 export type TermEditorStateRecord = { term: SolrTermType; state: SolrTermEditorRecordState; classifications:

我正在使用react
useState
,其中状态是一个具有一些嵌套属性的对象。当我对其调用
setState
时,我没有看到重新渲染或状态正在更新。我假设react看到新状态等于旧状态,因此不会发生更新。因此,我尝试先克隆状态,但仍然没有看到任何更新

如何使此函数导致状态更新

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类型道歉,但我在这里包含了它们,以便您可以看到状态的预期形状


它不是因为更改嵌套得很深而更新吗?有没有办法让它工作,或者我是否需要以某种方式将更改后的状态拉到它自己的状态?

新对象
不会进行深度复制,因此对于
setRecords
来说,它是同一个实例,不会触发重新渲染

const obj={
a:{
b:“b”
}
};
常量副本=新对象(obj);
复制[“c”]=“c”;
控制台日志(obj)