react19【系列实用教程】useEffect —— 副作用操作
什么是副作用操作在程序中副作用指的是 一个函数除了返回值之外还做了其他事情。 纯函数pure function同样的输入 → 永远返回同样的输出不会影响外部世界 有副作用的函数同样的输入 → 可能返回不一样的输出或者改动了外部世界比如改全局变量、发请求、操作 DOMReact 组件的任务就是渲染UI。所以对于React来说它的副作用就是组件在渲染之外做的其他事情。在 React 组件中副作用操作包括但不限于调用接口获取数据API 请求 / fetch / axios修改 DOM例如操作元素样式、位置、焦点等设置定时器setInterval / setTimeout订阅 WebSocket / 事件如监听滚动、广播、键盘输入操作浏览器 API比如 localStorage、sessionStorage、window 对象改变 URL如 window.locationuseEffect 用于编写由渲染本身引起的对接组件外部的操作官方称呼为副作用操作以下情况会触发页面渲染初次加载页面组件挂载响应式变量发生变化触发页面根据新值重新渲染组件更新关闭页面组件卸载以下情况需要添加副作用操作页面初步渲染完成后向服务器获取数据完成页面的最终渲染响应式变量发生变化时先根据新值执行必要的业务逻辑再进行最终的页面更新渲染关闭页面时需清除副作用如清除定时器移除全局事件等。useEffect 语法useEffect 是 hook 函数第一个参数必要 自定义的处理函数官方称呼为副作用函数可在副作用函数中 return 一个函数来清除副作用从第二次执行副作用函数开始每次都会先执行return中的清除副作用的函数再执行副作用函数当组件卸载时所有清除副作用的函数会按顺序依次执行。第二个参数可选 依赖项 不能为对象/数组等引用类型的数据因为引用类型的数据每次页面渲染时都会生成新地址若useEffect的处理函数会引发页面重新渲染则会导致死循环无依赖项执行副作用函数的时机组件初次渲染后组件挂载完成在开发环境会执行两次生产环境仅执行一次组件更新渲染前任一响应式变量变化都会触发import{useEffect}fromreact;functionDemo(){useEffect((){console.log(执行了副作用函数);});return(div你好/div/);}exportdefaultDemo;依赖项为空数组 []类似 vue 的生命周期 mounted执行副作用函数的时机组件初次渲染后组件挂载完成在开发环境会执行两次生产环境仅执行一次import{useEffect}fromreact;functionDemo(){useEffect((){console.log(执行了副作用函数);},[]);return(div你好/div/);}exportdefaultDemo;使用场景初次渲染页面时访问接口加载页面数据import{useEffect,useState}fromreact;importaxiosfromaxios;functionDemo(){const[list,setList]useState([]);useEffect((){asyncfunctiongetList(){constresawaitaxios.get(http://localhost:3000/dataList);setList(res.data);}getList();},[]);return({list.map((item)(div key{item.id}{item.title}/div))}/);}exportdefaultDemo;依赖项为响应式变量构成的数组类似 vue 的立即执行侦听器 watch执行副作用函数的时机组件初次渲染后组件挂载完成在开发环境会执行两次生产环境仅执行一次响应式变量发生变化触发页面进行更新渲染前import{useEffect,useState}fromreact;functionDemo(){const[name,setName]useState(朝阳);useEffect((){// 在挂载和 name 更新时都会执行console.log(当前name值为,name);},[name]);functionchangeName(){setName(晚霞);}return(button onClick{changeName}改名字/button/);}exportdefaultDemo;清除副作用最经典的场景即在组件卸载时清除计时器以免内存泄露清除副作用的逻辑写在 useEffect 内回调函数的 return 后面需要注意的是return 后必须是一个函数father.jsximport{useState}fromreact;importChildfrom./child.jsx;functionFather(){const[ifChild,setIfChild]useState(true);functionremoveChild(){setIfChild(false);}return(button onClick{removeChild}移除子组件/button{ifChildChild/}/);}exportdefaultFather;child.jsximport{useEffect}fromreact;functionChild(){useEffect((){// 添加定时器consttimersetInterval((){console.log(执行了定时器);},1000);return(){// 清除定时器clearInterval(timer);};});return(divh1我是子组件/h1/div/);}exportdefaultChild;如何关闭开发环境执行两次 将 src/main.jsx 中的React.StrictMode /React.StrictMode标签删除即可。useEffect 演示代码可通过下方演示代码在控制台监听查看父子组件副作用函数和清除副作用函数的执行顺序和时机father.jsximport{useEffect,useState}fromreact;importChildfrom./Child.jsx;exportdefaultfunctionFather(){const[showChild,setShowChild]useState(true);const[num,setNum]useState(0);console.log(父组件渲染);useEffect((){console.log(执行了父组件依赖[]的useEffect内的代码);return(){console.log(执行了父组件依赖[]的useEffect中return的函数);};},[]);return(div style{{border:1px solid,padding:10px,margin:10px}}h1父组件/h1pnum为{num}/pbutton onClick{(){setNum(num1);}}1/button{showChildChild/}button onClick{(){setShowChild(false);}}卸载子组件/buttonbutton onClick{(){setShowChild(true);}}挂载子组件/button/div);}Child.jsximport{useEffect,useState}fromreact;functionChild(){const[name,setName]useState(朝阳);console.log(子组件渲染);useEffect((){console.log(执行了子组件无依赖的useEffect内的代码);return(){console.log(执行了子组件无依赖的useEffect中return的函数);};});useEffect((){console.log(执行了子组件依赖 [] 的useEffect内的代码);return(){console.log(执行了子组件依赖 [] 的useEffect中return的函数);};},[]);useEffect((){console.log(执行了子组件中依赖name的useEffect内的代码);return(){console.log(执行了子组件中依赖name的useEffect中return的函数);};},[name]);return(div style{{border:1px solid,padding:10px,margin:10px}}h1子组件/h1p名称为{name}/pbutton onClick{()setName(张三)}改名称/button/div);}exportdefaultChild;

相关新闻

抖音无水印下载工具实战手册:从安装到批量下载全流程

抖音无水印下载工具实战手册:从安装到批量下载全流程

抖音无水印下载工具实战手册:从安装到批量下载全流程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback suppor…

2026/10/13 1:02:07 阅读更多 →
一条命令批量解锁微信语音:silk-v3-decoder 转 MP3 实战与原理全解

一条命令批量解锁微信语音:silk-v3-decoder 转 MP3 实战与原理全解

一条命令批量解锁微信语音:silk-v3-decoder 转 MP3 实战与原理全解 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion s…

2026/10/10 3:04:50 阅读更多 →
把闲置手机变成第二块屏幕:Deskreen屏幕共享从零到一的实战全记录

把闲置手机变成第二块屏幕:Deskreen屏幕共享从零到一的实战全记录

把闲置手机变成第二块屏幕:Deskreen屏幕共享从零到一的实战全记录 【免费下载链接】deskreen Deskreen turns any device with a web browser into a secondary screen for your computer. ⭐️ Star to support our work! 项目地址: https://gitcode.com/gh_mirr…

2026/10/4 22:10:12 阅读更多 →

最新新闻

CRF序列标注原理与实战:从全局最优解到工业级部署

CRF序列标注原理与实战:从全局最优解到工业级部署

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:01:48 阅读更多 →
Kibana汉化配置全解析:i18n.locale设置与版本兼容性指南

Kibana汉化配置全解析:i18n.locale设置与版本兼容性指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:01:48 阅读更多 →
FusionAccess虚拟桌面发放流程详解:从模板到用户登录的全链路拆解

FusionAccess虚拟桌面发放流程详解:从模板到用户登录的全链路拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:01:48 阅读更多 →
Hibernate No identifier异常:实体缺少@Id的原因排查与修复全指南

Hibernate No identifier异常:实体缺少@Id的原因排查与修复全指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:01:48 阅读更多 →
进口变压器替换厂家怎么选?参数对照与CE认证全流程指南

进口变压器替换厂家怎么选?参数对照与CE认证全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:01:48 阅读更多 →
claude-mem:为Claude Code打造自动跨会话记忆层

claude-mem:为Claude Code打造自动跨会话记忆层

最近一段时间一直在折腾一件事:让Claude Code在隔了一个晚上之后还能记得我昨天说过“这个模块用Python重写”以及“测试文件统一丢到tests目录”。中间试过各种“外置记忆”方案,最后真正解决问题的,是一个叫claude-mem的开源项目。claude-m…

2026/10/13 1:00:47 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →