reactjs - 为什么函数组件再次通过 setCount(1) 重新渲染
问题描述
代码:
https://codesandbox.io/s/amazing-sound-d20rz?file=/src/App.js
环境:
- 反应(v16.13.1)
- 反应(v16.12.0)
import React, { useState, useEffect } from "react";
import "./styles.css";
function AppRenderLog() {
console.log("app render");
return null;
}
export default function App() {
const [count, setCount] = useState(2);
useEffect(() => {
console.log("do something");
});
setTimeout(() => {
setCount(1);
setCount(1);
setCount(1);
});
console.log("render by setCont(1)");
return (
<div className="App">
{count}
<AppRenderLog />
</div>
);
}
期望输出:
render by setCont(1)
app render
do something
render by setCont(1)
app render
do something
电流输出:
render by setCont(1)
app render
do something
render by setCont(1)
app render
do something
render by setCont(1) // why? re-render App Component but effectCallback not exec, AppRenderLog Component not re-render
// why others not re-render <App />
解决方案
我不知道您要完成什么,但是如果您也将第二个 console.log 放在一个效果中,它不会双重记录那个。
- 第一个日志集来自组件安装。
- 第二个日志集来自在
setTimeout
. - 第三个(和后续的)日志集不会出现,因为状态并没有真正更新(即它被设置为相同的值)。您可以通过将初始状态设置为 1 来测试这一点,即
useState(1)
,您将只看到挂载的日志集。
代码:
import React, { useState, useEffect } from "react";
import "./styles.css";
function AppRenderLog() {
console.log("app render");
return null;
}
export default function App() {
const [count, setCount] = useState(2);
useEffect(() => {
console.log("do something");
});
setTimeout(() => {
setCount(1);
setCount(1);
setCount(1);
});
useEffect(() => {
console.log("render by setCont(1)");
});
return (
<div className="App">
{count}
<AppRenderLog />
</div>
);
}
控制台日志输出
app render
do something
render by setCont(1)
app render
do something
render by setCont(1)
初始状态为 1 时的控制台日志输出
app render
do something
render by setCont(1)
推荐阅读
- angularjs - 为什么在导入扩展名为 .ts 的 polyfills 文件时,webpack 构建时间会更快?
- amazon-web-services - 有没有办法使用 aws chime 从网页创建手机呼叫?
- elasticsearch - 尝试创建索引时出现 ElasticSearch Nest 异常 (Elasticsearch.Net.UnexpectedElasticsearchClientException) (Nest 7.12.0)
- selenium - AWS Device Farm 上基于浏览器的性能测试
- reactjs - 如何查看部署在谷歌应用引擎标准环境中的nexjs项目的日志?
- python - 从书中复制代码,但它不会显示输出
- amazon-web-services - AWS Glue - 如何连接到 DevEndpoint
- android - Ui工具包的标准是什么?
- javascript - 如何在提交时获取多个文本字段的值?
- c# - 使用 MVVM 的 WPF 父事件处理程序