reactjs - 想知道为什么组件更新时会执行componentWillUnmount
问题描述
应用程序.js
import React from "react";
import CounterOne from "./CounterOne";
function App() {
const [display, setDisplay] = React.useState(true);
return (
<>
{display && <CounterOne />}
<button
onClick={() => {
setDisplay(!display);
}}
>
display
</button>
</>
);
}
export default App;
CounterOne.js
import React, { useState } from "react";
function CounterOne() {
const [count, setCount] = useState(0);
React.useEffect(() => {
console.log("component did update");
return () => {
console.log("component will unmount");
};
}, [count]);
return (
<div>
<p>Count is {count}</p>
<button
onClick={() => {
setCount(0);
}}
>
reset
</button>
<button
onClick={() => {
setCount(count + 5);
}}
>
Add 5
</button>
<button
onClick={() => {
setCount(count - 1);
}}
>
Sub 1
</button>
</div>
);
}
export default CounterOne;
当我点击 Add 5 或 sub 1 按钮时,组件重新渲染,然后在浏览器控制台中打印
组件将卸载
组件确实更新了
我很困惑为什么在状态更新发生时会执行卸载部分
解决方案
因为当你改变一个组件的状态时,React 会重新渲染整个组件。所以会先卸载旧组件,触发useEffect中的return回调。当一个新组件被挂载时,useEffect 内部的逻辑将再次被触发,因此在“组件将卸载”消息之后您会看到“组件确实更新”。更多关于 useEffect的信息 `useEffect` 的预期回报是什么?.
推荐阅读
- verilog - If 语句中的 verilog 错误。(reg) 不是常数。目标
并发分配或输出端口连接应该是网络类型 - java - 如果 Spring Data JPA 中的参数为空,则忽略条件
- javascript - 当所有人断开连接时如何删除语音通道?
- docker - 尝试 Dockerize ASP.NET Core 5.0 应用程序时出现错误 NU1202
- windows - Bitdefender Blocking Go v1.17.2 Windows 程序
- python - 如何让 EasyOCR 返回 0 或空字符串
- r - 将默认 NA 从逻辑更改为字符
- azure-pipelines - GitHub Actions 是否具有与 Azure Pipeline 的自定义内部版本号语法等效的概念?
- r - 在 R 中创建用户定义的函数,其中包含一个列表,而不仅仅是一个输入
- python - 在 Python 中将大量 XML 文件转换为 XLSX