手册
目录
收藏539
分享
阅读2239
更新时间2025-08-20
useEffect Hook 允许您在组件中执行副作用。
副作用的一些示例是:获取数据、直接更新 DOM 和计时器。
useEffect 接受两个参数。 第二个参数是可选的。
useEffect(
我们以计时器为例。
使用 setTimeout() 计算初始渲染后 1 秒:
import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";
function Timer() {
const [count, setCount] = useState(0);
useEffect(() => {
setTimeout(() => {
setCount((count) => count + 1);
}, 1000);
});
return I've rendered {count} times!
;
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render( );
运行实例 »
但是等等!! 它一直在计数,即使它应该只计数一次!
useEffect 在每个渲染上运行。 这意味着当计数发生变化时,会发生渲染,然后触发另一个效果。
这不是我们想要的。 有几种方法可以控制副作用何时运行。
我们应该始终包含接受数组的第二个参数。
我们可以选择将依赖项传递给此数组中的 useEffect。
useEffect(() => {
//在每个渲染上运行
});
useEffect(() => {
//仅在第一次渲染时运行
}, []);
useEffect(() => {
//在第一次渲染时运行
//并且任何时候任何依赖值发生变化
}, [prop, state]);
所以,为了解决这个问题,我们只在初始渲染上运行这个效果。
只在初始渲染上运行效果:
import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";
function Timer() {
const [count, setCount] = useState(0);
useEffect(() => {
setTimeout(() => {
setCount((count) => count + 1);
}, 1000);
}, []); // <- 在此处添加空括号
return I've rendered {count} times!
;
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render( );
运行实例 »
这是一个依赖于变量的 useEffect Hook 示例。 如果 count 变量更新,效果会再次运行:
import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";
function Counter() {
const [count, setCount] = useState(0);
const [calculation, setCalculation] = useState(0);
useEffect(() => {
setCalculation(() => count * 2);
}, [count]); // <- 在此处添加计数变量
return (
<>
Count: {count}
Calculation: {calculation}
>
);
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render( );
运行实例 »
如果有多个依赖项,则应将它们包含在 useEffect 依赖项数组中。
有些效果需要清理以减少内存泄漏。
应该释放不再需要的超时、订阅、事件侦听器和其他效果。
我们通过在 useEffect Hook 的末尾包含一个返回函数来做到这一点。
在 useEffect Hook 结束时清理计时器:
import { useState, useEffect } from "react";
import ReactDOM from "react-dom/client";
function Timer() {
const [count, setCount] = useState(0);
useEffect(() => {
let timer = setTimeout(() => {
setCount((count) => count + 1);
}, 1000);
return () => clearTimeout(timer)
}, []);
return I've rendered {count} times!
;
}
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render( );
运行实例 »
注意:要清除计时器,我们必须为其命名。
相关
视频
RELATED VIDEOS
科技资讯
1
2
3
4
5
6
7
8
9
精选课程
共5课时
17.2万人学习
共49课时
77.1万人学习
共29课时
61.8万人学习
共25课时
39.4万人学习
共43课时
71万人学习
共25课时
61.7万人学习
共22课时
23万人学习
共28课时
33.9万人学习
共89课时
125.2万人学习