React 之 useEffect

useEffect 的作用

useEffect 是 React Hooks 中用于处理副作用的钩子函数。副作用是指那些不直接与组件渲染相关,但需要在组件生命周期中执行的操作,例如数据获取、订阅事件、手动修改 DOM 等。

如何理解副作用

在 React 中,组件的核心逻辑是渲染 UI,但某些操作(如 API 调用、定时器、事件监听)会影响外部状态或执行非渲染相关的任务,这些操作被称为"副作用"。

useEffect 的基本用法

jsx 复制代码
useEffect(() => {
  // 副作用逻辑(如数据获取、订阅事件)
  return () => {
    // 清理逻辑(如取消订阅、清除定时器)
  };
}, [dependencies]);
  • 第一个参数(函数):定义副作用的执行逻辑。
  • 第二个参数(依赖数组) :控制副作用何时重新执行。如果依赖项变化,副作用会重新运行;若为空数组 [],则仅在组件挂载和卸载时执行。
  • 清理函数(return):在组件卸载或依赖项变化前执行清理操作(如取消订阅)。

常见用例

数据获取
jsx 复制代码
useEffect(() => {
  const fetchData = async () => {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    setData(data);
  };
  fetchData();
}, []); // 空数组表示仅在组件挂载时执行
事件监听
jsx 复制代码
useEffect(() => {
  const handleResize = () => console.log('Window resized');
  window.addEventListener('resize', handleResize);
  return () => window.removeEventListener('resize', handleResize);
}, []); // 清理函数移除监听
依赖项控制
jsx 复制代码
useEffect(() => {
  console.log('Count updated:', count);
}, [count]); // 仅在 count 变化时执行

关键点

  • 避免无限循环:确保依赖项正确,避免频繁触发副作用。
  • 清理资源:防止内存泄漏(如定时器、订阅未清除)。
  • 按需执行:通过依赖项优化性能,减少不必要的副作用调用。

具体实例解析:

以事件监听为实例,代码如下:

javascript 复制代码
useEffect(() => {
  const handleResize = () => console.log('Window resized');
  window.addEventListener('resize', handleResize);
  return () => window.removeEventListener('resize', handleResize);
}, []); // 清理函数移除监听
运行顺序解析
  1. 组件挂载阶段

    当组件首次渲染时,useEffect 的回调函数会立即执行。代码中的箭头函数 () => { ... } 被调用,完成以下操作:

    • 定义 handleResize 函数。
    • 调用 window.addEventListener('resize', handleResize) 注册事件监听器。
  2. 依赖数组的作用

    依赖数组 [] 表示该 useEffect 仅在组件挂载时执行一次。若依赖数组包含变量(如 [someVar]),则变量变化时会重新执行回调函数及其清理函数。

  3. 清理函数执行时机

    清理函数 return () => { ... } 会在以下两种情况下执行:

    • 组件卸载时(如页面导航或组件被移除)。
    • 依赖项变化导致 useEffect 重新执行前(先执行清理函数,再运行新回调)。
具体流程示例
  • 首次渲染handleResize 定义 → addEventListener 调用 → 监听器生效。
  • 重新渲染(依赖不变):无操作(因依赖数组为空,回调不会重复执行)。
  • 组件卸载 :清理函数 removeEventListener 被调用,移除监听器。
注意事项
  • 清理函数的作用是避免内存泄漏,确保监听器随组件生命周期正确解除绑定。
  • 若依赖数组非空,清理函数会在每次依赖变化时优先执行。
相关推荐
问道飞鱼6 分钟前
【前端知识】React生态你了解多少?
前端·react.js·前端框架·生态
Pu_Nine_96 分钟前
前端SSE(Server-Sent Events)实现详解:从原理到前端AI对话应用
前端·langchain·sse·ai对话
我不是程序猿儿10 分钟前
【嵌入式】编码器计数倍频,机械一格与电气计数
stm32·单片机·嵌入式硬件·学习
阳光永恒73613 分钟前
C++编程全套学习资料免费分享 | 从零基础到进阶(含视频课/PPT课件/源码/项目实战)
c++·学习·编程学习·免费资料·零基础学c++·c++资料
Дерек的学习记录13 分钟前
Unreal Engine 5:前置知识和入门基础
学习·ue5
optimistic_chen16 分钟前
【Vue3入门】Pinia 状态管理 和 ElementPlus组件库
前端·javascript·vue.js·elementui·pinia·组件
kgduu17 分钟前
js之网络请求与远程资源
开发语言·javascript·网络
酉鬼女又兒19 分钟前
零基础入门前端JavaScript 核心语法:var/let/const、箭头函数与 setTimeout 循环陷阱全解析(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·蓝桥杯
EnglishJun21 分钟前
ARM嵌入式学习(八)--- 汇编应用:点亮led
汇编·arm开发·学习
PNP Robotics22 分钟前
PNP机器人亮相第二届机器人灵巧手国际创新大会
人工智能·学习·机器人·开源