组件与外部世界的桥梁:一文读懂 useEffect 的核心机制

简单来说,useEffect 是 React 函数组件中用来处理副作用 (Side Effects) 的钩子。

你可以把它理解为"组件与外部世界沟通的桥梁"。

组件的核心任务是渲染 (把数据变成 UI),这是一个纯净的计算过程。但有时候你需要做一些"不纯净"的事情,比如:

  • 去服务器拿数据。
  • 手动改一下网页标题。
  • 设置一个定时器。
  • 监听鼠标滚动。

这些事情都不能在渲染过程中直接做,必须交给 useEffect渲染结束后去做。


它的三个核心作用(对应类组件的生命周期)

如果你熟悉 React 类组件,useEffect 相当于 componentDidMountcomponentDidUpdatecomponentWillUnmount 这三个生命周期的组合体。

1. 组件挂载时执行 (Mount)

"组件刚出现时,做点什么。"

比如:页面一加载就请求 API,或者建立 WebSocket 连接。

JavaScript 复制代码
useEffect(() => {
  console.log('组件挂载了(只运行一次)');
  fetchData();
}, []); // ✅ 空数组:代表没有任何依赖,只在出生时跑一次

2. 依赖更新时执行 (Update)

"当某个数据变了,做点同步工作。"

这是 useEffect 最核心的设计理念:同步。保持组件内部状态和外部系统同步。

JavaScript 复制代码
useEffect(() => {
  console.log('userId 变了,我要重新获取用户信息');
  fetchUserInfo(userId);
}, [userId]); // ✅ 依赖数组:只要 userId 变,我就重跑

3. 组件卸载/清理时执行 (Unmount / Cleanup)

"组件要消失了(或者依赖变了),把之前的烂摊子收拾一下。"

比如:清除定时器、取消订阅、断开连接,防止内存泄漏。

JavaScript 复制代码
useEffect(() => {
  const timer = setInterval(() => console.log('Tick'), 1000);

  // 👇 返回一个清理函数
  return () => {
    clearInterval(timer);
    console.log('组件卸载了,或者下次 Effect 运行前,先清理旧的定时器');
  };
}, []);

总结一张表

写法 含义 对应类组件生命周期
useEffect(() => { ... }) 每次渲染后都跑 componentDidMount + componentDidUpdate
useEffect(() => { ... }, []) 只在第一次渲染后跑 componentDidMount
useEffect(() => { ... }, [prop]) 只在 prop 变化后跑 componentDidUpdate (带判断)
useEffect(() => { return () => ... }, []) 组件销毁时跑 componentWillUnmount

一句话心法

useEffect 的作用是告诉 React: "等把界面画好之后,去帮我做这件这件额外的事(副作用)。如果我依赖的变量变了,记得重做一遍。"

相关推荐
两点王爷16 小时前
一个快速加载面和多面数据的html测试页面(可以导出geojson数据文件)
前端·html·gis
热爱前端的小张16 小时前
第四章 接口和类型兼容性
前端
hunterandroid16 小时前
[鸿蒙从零到一] HarmonyOS 资源管理与多语言适配实战
前端
用户693717500138416 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
无人生还16 小时前
第 1 篇:从 Vue3 到 React 的思维转变
前端·vue.js·react.js
爱分享的程序猿-Clark16 小时前
【前端分享】vue开发项目,如何实现 从A页面跳转到B页面,并传值!
前端·javascript·vue.js
breeze jiang17 小时前
从原生事件到 React 组件化:用状态驱动模型加载进度 UI
前端·react.js·ui
徐小夕17 小时前
花了3天,我写了一款开源AI公众号编辑器
前端·vue.js·github
PBitW17 小时前
git 中容易遗忘的点 (二) ⚡⚡⚡
前端·git·面试
Hilaku17 小时前
2026 年前端大洗牌:React 服务端到 Vite 的底层重构
前端·javascript·程序员