组件与外部世界的桥梁:一文读懂 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: "等把界面画好之后,去帮我做这件这件额外的事(副作用)。如果我依赖的变量变了,记得重做一遍。"

相关推荐
REDcker10 分钟前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding2 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马2 小时前
Raku正则匹配与数据批量处理实操案例
前端
nbwenren2 小时前
2026实测:Gemini 3 镜像站视觉能力实践——拍照原型图,一键生成 HTML+CSS 代码
前端·css·html
Lee川2 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
jinanwuhuaguo2 小时前
(第二十九篇)OpenClaw 实时与具身的跃迁——从异步孤岛到数字世界的“原住民”
前端·网络·人工智能·重构·openclaw
广州华水科技2 小时前
深度测评2026年单北斗GNSS位移监测系统推荐,与高口碑变形监测设备一同引领行业新风尚
前端
Alice-YUE3 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript
是上好佳佳佳呀4 小时前
【前端(十一)】JavaScript 语法基础笔记(多语言对比)
前端·javascript·笔记