reactjs - 在 useEffect() 中更新对象的状态是否会创建一个新对象?
问题描述
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>
);
}
当输入秘密时,反应进入无限循环
我正在通过博客文章阅读此代码,并写道在 useEffect 中设置对象的状态会创建一个新对象,因此useEffect [] 中的依赖关系会发生变化并导致无限循环。
这是我的问题,当我们键入并且 onchange 被触发并且也在更新状态时,更新 onchange 内部的状态不会创建新对象吗?以及创建新对象的情况是什么?
这是博客的链接(第二点)链接
解决方案
React 中的经验法则是状态对象是不可变的,不能直接改变它。因此,每当您想更新状态时,您总是会创建新对象。
查看您的代码,在两种情况下创建的新对象onChange
在useEffects
. 但是useEffects
随着依赖关系的改变而创建无限循环,而 onChange 不会创建无限循环,因为状态更新不会onChange
再次
如果你想避免无限循环,我建议两种方法。
- 将依赖数组从
[secret] --> [secret.value]
- 或者将这 2 个值
value, countSecrets
作为 2 个不同的状态
总之,当您将对象作为状态时,您应该始终创建新对象并设置它。至于基于值的状态,react 会处理它。
推荐阅读
- vba - Excel vba 公式字符串:数组公式 - 如何模拟 Ctrl+Shift+Enter 按下
- github - 如何在 MongooseIM 中创建和编译自定义模块
- sql - 从表中删除可能不存在的数据
- java - Apache batik PNGTranscoder 的 HTTPS 问题
- sql - SQL 将数据库和数据复制到开发机器上
- python - str 类型 Python 2 中的 UTF-8 编码
- android - 如何从触发填充请求的位置获取客户端应用程序的包名称
- scala - 使用 Intellij IDE 运行 Scala Dotty 项目
- java - 如何解决 java.sql.SQLRecoverableException:IO 错误:连接超时
- java - 如何在 Apache POI 数据透视表报表过滤器中设置多个默认值