【发布时间】:2021-06-25 19:37:37
【问题描述】:
import { useEffect, useState } from "react";
function CountSecrets() {
const [secret, setSecret] = useState({ value: "", countSecrets: 0 });
useEffect(() => {
if (secret.value === 'secret') {
setSecret(s => ({...s, countSecrets: s.countSecrets + 1})); }
}, [secret]);
const onChange = ({ target }) => {
setSecret(s => ({ ...s, value: target.value }));
};
return (
<div>
<input type="text" value={secret.value} onChange={onChange} />
<div>Number of secrets: {secret.countSecrets}</div>
</div>
);
}
当输入 secret 时,反应进入无限循环
我正在通过一篇博客文章阅读这段代码,其中写道在 useEffect 中设置对象的状态 创建一个新对象,因此 useEffect 的 [ ] 中的依赖项 变化并导致无限循环。
这是我的问题,当我们键入并且 onchange 被触发并且也在更新状态时,更新 onchange 内部的状态是否不会创建新对象?以及创建新对象的情况是什么?
这是博客的链接(第二点)Link
【问题讨论】:
-
它不会创建新对象。问题在于比较 JS 中的对象; 2 个对象永远不会相同,即使它们包含相同的键/值。阅读此答案:stackoverflow.com/a/66058022/1927991
-
更新状态不会自动创建一个新对象,每次你的状态改变时,你都有责任为 React 提供一个新对象,在上述所有情况下你都会这样做。
-
但是我正在更新状态,所以这会创建新对象吗?
标签: reactjs infinite-loop use-effect use-state