当前位置: 首页 > news >正文

React之useEffect

在React中,useEffect 是一个非常重要的Hook,它用于管理副作用操作。副作用指的是那些不直接与组件渲染相关的操作,例如数据获取、订阅、手动DOM操作等。本文将详细介绍 useEffect 的概念、基础使用、参数说明以及如何清除副作用,并提供多个实用的使用案例。

1. 概念

useEffect 允许在函数组件中执行副作用操作。它在每次组件渲染后都会执行指定的副作用操作,并且可以选择性地在组件卸载时清除副作用。

2. 基础使用

基本的 useEffect 使用方式是在函数组件内部调用它,并传递一个回调函数作为第一个参数,这个回调函数包含我们希望在每次渲染之后执行的副作用操作。

import React, { useEffect, useState } from 'react';function ExampleComponent() {const [count, setCount] = useState(0);// 每次组件渲染后更新文档标题useEffect(() => {document.title = `You clicked ${count} times`;});return (<div><p>You clicked {count} times</p><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}export default ExampleComponent;

在上面的示例中,useEffect 中的回调函数会在每次组件渲染后更新文档标题,因为它没有指定依赖数组(第二个参数),所以每次 count 变化时都会执行。

3. 参数说明

useEffect 可以接收两个参数:

  • 第一个参数:副作用操作的函数。该函数会在每次组件渲染后执行。
  • 第二个参数(可选):依赖数组,用于控制副作用的触发时机。只有当依赖数组中的值发生变化时,才会重新执行副作用操作。
useEffect(() => {// 副作用操作
}, [dependency1, dependency2]);

如果依赖数组为空 [],则副作用操作只在组件挂载和卸载时执行。

4. 清除副作用

在某些场景下,我们需要在组件卸载时清除副作用操作,以避免内存泄漏或无效的操作。为了实现这一点,useEffect 可以返回一个清除函数。

useEffect(() => {// 执行副作用操作return () => {// 清除副作用操作};
}, [dependency]);

清除函数会在组件卸载时执行,或者在依赖项变化导致副作用重新运行之前执行。

5. 使用案例

数据获取
import React, { useEffect, useState } from 'react';function DataFetcher() {const [data, setData] = useState(null);useEffect(() => {const fetchData = async () => {try {const response = await fetch('https://api.example.com/data');const data = await response.json();setData(data);} catch (error) {console.error('Error fetching data:', error);}};fetchData();}, []); // 空依赖数组表示只在组件挂载和卸载时执行return (<div>{data ? (<ul>{data.map(item => (<li key={item.id}>{item.name}</li>))}</ul>) : (<p>Loading...</p>)}</div>);
}export default DataFetcher;

在这个例子中,useEffect 用于获取远程数据。通过空的依赖数组 [],确保数据只在组件挂载时获取一次。

订阅和取消订阅
import React, { useEffect, useState } from 'react';
import EventSource from 'eventsource';function EventSubscriber() {const [events, setEvents] = useState([]);useEffect(() => {const eventSource = new EventSource('https://api.example.com/events');eventSource.onmessage = (event) => {setEvents(prevEvents => [...prevEvents, JSON.parse(event.data)]);};return () => {eventSource.close();};}, []); // 空依赖数组表示只在组件挂载和卸载时执行return (<div><ul>{events.map((event, index) => (<li key={index}>{event.message}</li>))}</ul></div>);
}export default EventSubscriber;

在这个例子中,useEffect 用于订阅事件源,每当收到新事件时更新组件状态。在组件卸载时,清除事件源的订阅以防止内存泄漏。

手动操作DOM或其他全局副作用
import React, { useEffect } from 'react';function DOMManipulator() {useEffect(() => {// 操作DOM或执行其他全局副作用操作const header = document.querySelector('h1');if (header) {header.style.color = 'red';}// 清除副作用return () => {if (header) {header.style.color = 'black';}};}, []); // 空依赖数组表示只在组件挂载和卸载时执行return (<div><h1>Hello, world!</h1></div>);
}export default DOMManipulator;

在这个例子中,useEffect 用于在组件挂载时修改页面中的标题颜色为红色,并在组件卸载时恢复为默认颜色。这展示了如何在React中执行一些需要直接操作DOM或者其他全局环境的副作用操作。

##总结

useEffect 是React函数组件中用于处理副作用操作的重要Hook。它的灵活性和清晰的依赖管理使得我们能够在组件中执行各种副作用操作,包括数据获取、订阅、手动DOM操作等。通过理解其基本用法、参数说明和清除副作用的方法,能够更好地应用于实际场景中,提高代码的可维护性和可读性。

希望本文能够帮助你更好地理解和使用 useEffect,从而编写出更健壮和高效的React应用。

相关文章:

React之useEffect

在React中&#xff0c;useEffect 是一个非常重要的Hook&#xff0c;它用于管理副作用操作。副作用指的是那些不直接与组件渲染相关的操作&#xff0c;例如数据获取、订阅、手动DOM操作等。本文将详细介绍 useEffect 的概念、基础使用、参数说明以及如何清除副作用&#xff0c;并…...

测试辅助工具(抓包工具)的使用3 之 弱网测试

1.为什么要进行弱网测试&#xff1f; 1.带宽1M和带宽100M打开tpshop网站效果一样吗&#xff1f; 2.手机使用2G网络和使用3G网络打开京东的效果一样吗&#xff1f; 弱网环境下&#xff0c;出现丢包、延时软件的处理机制&#xff0c;避免造成用户的流失。 2.如何进行弱网测试&…...

【Redis】基于Redission实现分布式锁(代码实现)

目录 基于Redission实现分布式锁解决商品秒杀超卖的场景&#xff1a; 1.引入依赖&#xff1a; 2.加上redis的配置&#xff1a; 3.添加配置类&#xff1a; 4.编写代码实现&#xff1a; 5.模拟服务器分布式集群的情况&#xff1a; 1.右键点击Copy Configuration 2.点击Modi…...

websocket 安全通信

WebSocket 协议 WebSocket&#xff1a;在 2008 年诞生&#xff0c;2011 年成为国际标准。它允许服务器主动向客户端推送信息&#xff0c;客户端也可以主动向服务器发送信息&#xff0c;实现了真正的双向平等对话。它是一种在单个 TCP 连接上进行全双工通讯的协议&#xff0c;能…...

代码生成技术技术-janino

文章目录 背景简单例子flink 例子 背景 代码生成技术适合在需要动态代码编译的场景中使用。比如大数据计算场景下&#xff0c;经常会要把flink sql 转成实际的执行计划 简单例子 代码是一个string 类型&#xff0c;直接用janino 编译后&#xff0c;就可以得到加载到jvm里的c…...

QT事件处理系统之四:自定义事件的注册及拦截、发送

1、自定义事件的注册 自定义事件对象 自定义的事件类必须继承自QEvent,并且无需指定父类 自定义的事件类必须拥有全局唯一的Type值,使用QEvent::User+value即可。 class MyEvent : public QEvent {public:MyEvent();QString getStr() {...

vs2022 studio控制台出现中文乱码解决

vs2022 studio控制台出现中文乱码解决 问题解决 问题 这里cout中间的中文&#xff0c;但控制台出现的是乱码对此需要进行修改 解决 打开运行的主文件&#xff0c;也就是整个程序的入口&#xff0c;对他另存为 之后点击编码保存 接着将编码保存的格式变为图片对应的这种 记…...

支持向量机介绍

一、引言 1.支持向量机&#xff08;SVM&#xff09;的概念和背景 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;是一种起源于统计学习理论的分类和回归算法。20世纪60年代&#xff0c;Vapnik等人提出了支持向量机理论&#xff0c;该理论基…...

电压互感器在线监测的原理

电压互感器在线监测的原理主要基于电磁感应、电场效应以及一系列先进的监测技术。以下是对其原理的详细解释&#xff1a; 一、电磁感应原理 电压互感器&#xff08;Voltage Transformer&#xff0c;简称VT&#xff09;本质上是一种降压变压器&#xff0c;它利用电磁感应的原理…...

算法训练与程序竞赛题目集合(L4)

目录 L4-103 就不告诉你 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; L4-104 Wifi密码 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; L4-105 冠军魔术 输入格式&#xff1a; …...

Selenium进行Web自动化测试

Selenium进行Web自动化测试 SeleniumPython实现Web自动化测试一、环境配置 SeleniumPython实现Web自动化测试 一、环境配置 环境基于win10&#xff08;X64&#xff09; 安装Python&#xff1b;安装PyCham安装chomedriver chomedriver下载地址 可以查看本地chrome软件版本下载…...

模拟算法讲解

模拟算法是一种基于实际情况模拟的算法&#xff0c;通过模拟现实世界中的系统或过程&#xff0c;来研究它们的性质和行为。模拟算法可以用于解决各种问题&#xff0c;包括物理模拟、经济模拟、社会模拟等。 模拟算法的基本步骤包括&#xff1a; 定义问题&#xff1a;明确需要模…...

Leetcode 3196. Maximize Total Cost of Alternating Subarrays

Leetcode 3196. Maximize Total Cost of Alternating Subarrays 1. 解题思路2. 代码实现 题目链接&#xff1a;3196. Maximize Total Cost of Alternating Subarrays 1. 解题思路 这一题就是一个动态规划&#xff0c;只需要考虑每一个元素作为开始和处于序列当中的二元态即可…...

Elasticsearch**Elasticsearch自定义插件开发入门

Elasticsearch作为一个强大的搜索引擎和数据分析工具&#xff0c;其强大的扩展性是其受欢迎的重要原因之一。自定义插件开发入门** Elasticsearch作为一个强大的搜索引擎和数据分析工具&#xff0c;其强大的扩展性是其受欢迎的重要原因之一。通过自定义插件&#xff0c;用户可…...

在Ubuntu中创建Ruby on Rails项目并搭建数据库

新建Rails项目 先安装bundle Ruby gem依赖项工具&#xff1a; sudo apt install bundle 安装Node.js: sudo apt install nodejs 安装npm 包管理器&#xff1a; sudo apt install npm 安装yarn JavaScript包管理工具&#xff1a; sudo apt install yarn 安装webpacker: …...

微信小程序反编译 2024 unveilr.exe

ps&#xff1a;一开始用的反编译工具是wxappUnpacker&#xff0c;后面改为 unveilr.exe 1.先找到小程序安装目录“E:\聊天记录\WeChat Files\Applet”&#xff0c;要反编译小程序的包 文件夹下的名字对应的是小程序ID&#xff0c;如果不确定是哪个&#xff0c;可以删除->打…...

测试测量-DMM直流精度

测试测量-DMM直流精度 最近去面试&#xff0c;发现了自己许多不足&#xff0c;比如我从未考虑过万用表准或者不准&#xff0c;或者万用表有多准&#xff1f; 在过去的实验室中&#xff0c;常用的DMM有KEYSIGHT 34401A以及 KEITHLEY THD2015&#xff0c;就以这两台为例&#x…...

AGV机器人的调度开发分析(2)- 内核中的调度

我们开发AGV的调度系统&#xff0c;最重要的是要实现调度的运行&#xff0c;那么调度要执行哪些任务呢&#xff1f; 先来看看德国开发的开源openTCS中的功能定义&#xff1a; openTCS的控制核心是kernel&#xff0c;目的是提供运输系统/工厂的抽象驾驶模型&#xff0c;管理运…...

HTTP详细总结

概念 HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。 特点 基于TCP协议: 面向连接&#xff0c;安全 TCP是一种面向连接的(建立连接之前是需要经过三次握手)、可靠的、基于字节流的传输层通信协议&#xff0c;在…...

【Android】代码中将 SVG 图像转换颜色

要在代码中将 SVG 图像转换为黑色&#xff0c;你可以使用一个库&#xff0c;例如 AndroidSVG 或 SVG-Android。以下是一个简单的示例代码&#xff0c;展示了如何通过代码方式将 SVG 图像改为黑色&#xff1a; // 导入 AndroidSVG 库 import com.caverock.androidsvg.SVG; impo…...

在WinForm里玩转Halcon 3D点云:从C#代码导出到完整UI显示的保姆级避坑指南

在WinForm里玩转Halcon 3D点云&#xff1a;从C#代码导出到完整UI显示的保姆级避坑指南 当工业视觉项目需要处理复杂的三维场景时&#xff0c;Halcon的3D点云处理能力往往成为开发者的首选。但将Halcon的强大算法无缝集成到C# WinForm应用中&#xff0c;却可能遭遇一系列"…...

MSSQL03:SQLServer数据库中的高级语法及其技巧

目录 一、日期相关 1.查询当前日期相关数据 2.查询特定时间区间 3.时间加减法 &#xff08;1&#xff09;加法 &#xff08;2&#xff09;减法 4.格式化日期 二、数据类型转化 1.Int -> Decimal 2.DateTime->OtherTime 3.DateTime->string 三、条件判断相关…...

FinalShell v4.5.12 安装避坑指南:为什么你的远程连接总是失败?

FinalShell 4.5.12 高效配置手册&#xff1a;从安装到稳定连接的进阶实践 远程终端工具的选择往往决定了运维效率的天花板。作为一款集SSH连接、文件传输、性能监控于一体的全能型工具&#xff0c;FinalShell近年来在开发者社区中积累了不错的口碑。但不少用户在初次接触时&…...

从LVGL V7.11到V9.1:我维护中文文档这三年踩过的坑与实战经验

从LVGL V7.11到V9.1&#xff1a;一个中文文档维护者的技术叙事 三年前&#xff0c;当我第一次在嵌入式项目中尝试使用LVGL时&#xff0c;完全没想到这个轻量级图形库会成为我技术生涯中的重要篇章。作为国内最早系统维护LVGL中文文档的开发者之一&#xff0c;这段跨越三个大版本…...

一篇文章彻底搞懂Linux驱动的并发控制与中断上下半部机制

在嵌入式 Linux 驱动开发中&#xff0c;并发控制与中断处于极其重要的核心地位。本文&#xff0c;我将结合 CPU 的行为与操作系统的调度&#xff0c;深入分析 spinlock 和 mutex 的本质区别&#xff0c;以及 Linux 中断上下半部。1. 上下文的概念 在深入探究锁和中断之前&#…...

专业级foobar2000个性化配置方案:提升音乐管理效率的foobox-cn

专业级foobar2000个性化配置方案&#xff1a;提升音乐管理效率的foobox-cn 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobox-cn是一套针对foobar2000音乐播放器的专业级DUI&#xff08;DirectUI…...

Winhance中文版:图形界面驱动的Windows系统优化解决方案

Winhance中文版&#xff1a;图形界面驱动的Windows系统优化解决方案 【免费下载链接】Winhance-zh_CN A Chinese version of Winhance. C# application designed to optimize and customize your Windows experience. 项目地址: https://gitcode.com/gh_mirrors/wi/Winhance-…...

用Python和Geogebra手把手复现阿克曼转向模型(附完整代码与可视化)

用Python和Geogebra手把手复现阿克曼转向模型&#xff08;附完整代码与可视化&#xff09; 在自动驾驶和机器人领域&#xff0c;理解车辆如何转向是基础中的基础。但当你第一次看到那些复杂的公式时&#xff0c;是不是感觉像在看天书&#xff1f;别担心&#xff0c;今天我们就用…...

免费开源:如何用LiteDB.Studio高效管理嵌入式数据库?

免费开源&#xff1a;如何用LiteDB.Studio高效管理嵌入式数据库&#xff1f; 【免费下载链接】LiteDB.Studio A GUI tool for viewing and editing documents for LiteDB v5 项目地址: https://gitcode.com/gh_mirrors/li/LiteDB.Studio 在嵌入式数据库管理领域&#xf…...

告别大模型幻觉!RAG 原理 + Spring AI 代码实现一步到位

RAG 诞生背景&#xff1a;大模型原生缺陷 LLM 存在 3 个无法自愈的问题&#xff0c;这是 RAG 技术的核心出发点&#xff1a; LLM存在幻觉现象, 生成无事实依据、虚假编造的内容LLM知识更新缓慢, 预训练数据固定&#xff0c;无法同步新数据 / 私有数据LLM对领域知识的理解有限, …...