react 中 useEffect Hook 作用

`useEffect`是一个用于处理副作用(Side Effects)的 Hook

一、处理副作用

1. 副作用的概念

副作用是指在组件渲染过程中执行的、会影响组件外部环境或具有外部可见影响的操作。

常见的副作用包括数据获取(如从服务器获取数据)、订阅外部数据源(如消息队列、事件总线)、手动操作 DOM(如修改页面标题、滚动位置)以及设置定时器等。

2. useEffect 基本用法

2.1 语法结构

`useEffect`接受两个参数,第一个参数是一个函数,称为副作用函数(Effect Function),在这个函数内部执行实际的副作用操作。第二个参数是一个可选的依赖项数组(Dependency Array)。

import React, { useEffect, useState } from "react";const MyComponent = () => {const [count, setCount] = useState(0);useEffect(() => {// 这是一个副作用函数,这里模拟从服务器获取数据console.log("Fetching data...");return () => {// 可选的清理函数,用于在组件卸载或依赖项变化时清理副作用console.log("Cleaning up...");};}, []);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);};export default MyComponent;

在这个例子中,副作用函数在组件挂载时执行,因为依赖项数组为空(`[]`),表示这个副作用只在组件初始化时触发一次。副作用函数还返回了一个清理函数,用于在组件卸载或依赖项变化时执行清理操作。

二、模拟生命周期方法

1. 替代 componentDidMount

在类组件中,`componentDidMount`方法在组件挂载到 DOM 后立即执行。在函数组件中,可以使用`useEffect`来实现类似的功能。当`useEffect`的依赖项数组为空时,副作用函数在组件第一次渲染(挂载)后执行,相当于`componentDidMount`。

import React, { useEffect, useState } from "react";const MyComponent = () => {const [data, setData] = useState(null);useEffect(() => {// 模拟在组件挂载后获取数据,相当于componentDidMountfetch("https://example.com/api/data").then((response) => response.json()).then((jsonData) => setData(jsonData));}, []);return <div>{data ? <p>{data}</p> : <p>Loading...</p>}</div>;};export default MyComponent;

2. 替代 componentDidUpdate

在类组件中,`componentDidUpdate`方法在组件每次更新(`state`或`props`变化)后执行。在函数组件中,可以通过在`useEffect`的依赖项数组中指定依赖项来模拟`componentDidUpdate`。当依赖项发生变化时,副作用函数会重新执行,类似于`componentDidUpdate`。

import React, { useEffect, useState } from "react";const MyComponent = () => {const [count, setCount] = useState(0);const [data, setData] = useState(null);useEffect(() => {// 当count变化时,重新获取数据,类似于componentDidUpdateif (count > 0) {fetch("https://example.com/api/data").then((response) => response.json()).then((jsonData) => setData(jsonData));}}, [count]);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button>{data ? <p>{data}</p> : <p>Loading...</p>}</div>);};export default MyComponent;

3. 替代 componentWillUnmount

在类组件中,`componentWillUnmount`方法在组件卸载前执行,用于清理资源。在函数组件中,`useEffect`的副作用函数返回的清理函数在组件卸载或依赖项变化时执行,从而替代了`componentWillUnmount`的功能。

import React, { useEffect, useState } from "react";const MyComponent = () => {const [count, setCount] = useState(0);useEffect(() => {const timer = setInterval(() => {setCount(count + 1);}, 1000);return () => {// 组件卸载或依赖项变化时清除定时器,相当于componentWillUnmountclearInterval(timer);};}, []);return (<div><p>Count: {count}</p></div>);};export default MyComponent;

三、依赖项管理和优化

1. 依赖项的作用

1.1 决定副作用执行时机

例如:如果一个副作用函数依赖于组件的某个状态值,将这个状态值放入依赖项数组中,那么当这个状态值改变时,副作用函数就会重新运行。这样可以确保副作用与组件的状态和属性保持同步。

2. 优化性能

例如:在不必要的时候重复获取数据或重新订阅事件,浪费资源并可能导致应用程序性能下降。

3. 优化策略和常见错误

3.1 空依赖项数组的优化与风险

例如:初始化数据获取或设置全局事件监听器。但如果在副作用函数中使用了组件的状态或属性,并且没有将它们包含在依赖项数组中,就会导致闭包问题。

import React, { useEffect, useState } from "react";const MyComponent = () => {const [count, setCount] = useState(0);useEffect(() => {// 错误:没有将count包含在依赖项数组中,导致闭包问题console.log("Count:", count);}, []);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);};export default MyComponent;

3.2 正确指定依赖项

为了避免上述问题,需要将副作用函数中使用的所有组件的状态、属性以及其他外部函数(如果在副作用函数内部调用)都包含在依赖项数组中。

import React, { useEffect, useState } from "react";const MyComponent = () => {const [count, setCount] = useState(0);useEffect(() => {console.log("Count:", count);}, [count]);return (<div><p>Count: {count}</p><button onClick={() => setCount(count + 1)}>Increment</button></div>);};export default MyComponent;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472480.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

w~视觉~合集23

我自己的原文哦~ https://blog.51cto.com/whaosoft/12548542 #DragGAN 在 AIGC 的神奇世界里&#xff0c;我们可以在图像上通过「拖曳」的方式&#xff0c;改变并合成自己想要的图像。比如让一头狮子转头并张嘴&#xff1a; 实现这一效果的研究出自华人一作领衔的「Drag You…

从电动汽车到车载充电器:LM317LBDR2G 线性稳压器在汽车中的多场景应用

附上LM317系列选型&#xff1a; LM317BD2TG-TO-263 LM317BTG-TO-220 LM317BD2TR4G-TO-263 LM317D2TG-TO-263 LM317D2TR4G-TO-263 LM317TG-TO-220 LM317LBDR2G-SOP-8 LM317LDR2G-SOP-8 LM317MABDTG-TO-252 LM317MABDTRKG-TO-252 LM317MA…

【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题

问题描述&#xff1a; 在实操中&#xff0c;git push代码到github上一直提示输入用户名及密码&#xff0c;并且跳出的输入框输入用户名和密码后&#xff0c;报错找不到远程仓库 实际解决中&#xff0c;发现我环境有两个问题解决&#xff1a; git push一直提示输入用户名及密码…

测试实项中的偶必现难测bug--互斥逻辑异常

问题: 今天线上出了一个很奇怪的问题,看现象和接口是因为数据问题导致app模块奔溃 初步排查数据恢复后还是出现了数据重复的问题,查看后台实际只有一条数据,但是显示在app却出现了两条一模一样的置顶数据 排查: 1、顺着这个逻辑,我们准备在预发复现这个场景,先是cop…

二五、pxe自动装机

pxe自动装机 pxe------------------------------自动安装系统必要的运行环境 无人值守--------------------为系统定制化的安装需要的软件 pxe的优点&#xff1a; 1、规模化&#xff1a;同时装配多台服务器&#xff08;20-30&#xff09; 2、自动化&#xff1a;系统安装和…

算法魅力-二分查找实战

目录 前言 算法定义 朴素二分模版 二分查找 二分的边界查找 在排序数组中查找元素的第一个和最后一个位置&#xff08;medium&#xff09; 暴力算法 二分查找 边界查找分析 山峰数组的峰顶 暴力枚举 二分查找 搜索旋转排序数组中的最小值&#xff08;medium&#xf…

# 第20章 Cortex-M4-触摸屏

第20章 Cortex-M4-触摸屏 20.1 触摸屏概述 20.1.1 常见的触摸屏分类 电阻式触摸屏、电容式触摸屏、红外式触摸屏、表面声波触摸屏 市场上用的最多的是电阻式触摸屏与电容式触摸屏。红外管式触摸屏多用于投影仪配套设备。 电阻式触摸屏构成&#xff1a;整个屏由均匀电阻构成…

大数据新视界 -- 大数据大厂之 Impala 性能优化:基于数据特征的存储格式选择(上)(19/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Gitcode文件历史记录查看和还原

文件历史记录 文件历史记录用于记录代码文件的更改历史&#xff0c;它允许用户查看文件的不同版本&#xff0c;了解每个版本的修改内容、作者和提交消息。这对于跟踪文件演进、恢复错误更改、审查代码以及了解项目进展都非常有用。 文件历史记录功能提供了以下核心功能&#…

数据结构-二叉树及其遍历

🚀欢迎来到我的【数据结构】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏🌍前言 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相…

Java集合(Collection+Map)

Java集合&#xff08;CollectionMap&#xff09; 为什么要使用集合&#xff1f;泛型 <>集合框架单列集合CollectionCollection遍历方式List&#xff1a;有序、可重复、有索引ArrayListLinkedListVector&#xff08;已经淘汰&#xff0c;不会再用&#xff09; Set&#xf…

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用&#xff1a; 函数的局部变量和全局变量 局部变量的作用&#xff1a;在函数体内部&#xff0c;临时保存数据&#xff0c;即当函数调用完成后&#xff0c;则销毁局部变量。 money 5000000 n…

reduce-scatter:适合分布式计算;Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响

目录 Gather Scatter Reduce reduce-scatter:适合分布式计算 Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响 计算结果理论正确性 资源消耗方面 Gather 这个也很好理解,就是把多个进程的数据拼凑在一起。 Scatter 不同于Br…

C++- 基于多设计模式下的同步异步日志系统

第一个项目:13万字,带源代码和详细步骤 目录 第一个项目:13万字,带源代码和详细步骤 1. 项目介绍 2. 核心技术 3. 日志系统介绍 3.1 为什么需要⽇志系统 3.2 ⽇志系统技术实现 3.2.1 同步写⽇志 3.2.2 异步写⽇志 4.知识点和单词补充 4.1单词补充 4.2知识点补充…

Node.js GET/POST请求、WEB模块使用介绍 (基础介绍 八)

GET/POST请求 在很多场景中&#xff0c;我们的服务器都需要跟用户的浏览器打交道&#xff0c;如表单提交。 表单提交到服务器一般都使用 GET/POST 请求。 本章节我们将为大家介绍 Node.js GET/POST请求。 获取GET请求内容 由于GET请求直接被嵌入在路径中&#xff0c;URL是…

字节青训-小M的多任务下载器挑战、版本号比较

目录 一、小M的多任务下载器挑战 题目背景 题目内容 数据输入 数据输出 数据与约定 示例1 示例2 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、版本号比较 问题描述 样例 示例 1: 示例 2: 示例 3:…

jenkins用户在执行scp的时候如何做免密登录

一、背景 在jenkins job中执行scp的shell命令&#xff0c;当然不希望每次输入密码&#xff0c;另外处于出于安全考虑&#xff0c;也不建议在scp命令中指定。 所以&#xff0c;我们需要对远程机器进行免密登录。 本文遇到的问题是&#xff0c;在jenkins机器上执行scp已做到了…

Prometheus监控SQL SERVER常用指标和PromQL预警

SQL Server是企业级广泛应用的数据库&#xff0c;通过简单的Prometheus exportor可以很容易地监控它。与所有数据库一样&#xff0c;SQL Server也有许多故障点&#xff0c;例如事务延迟或数据库中连接过多。本文介绍如何使用Prometheus监视SQL Server&#xff0c;包括常用的监控…

HTML5实现俄罗斯方块小游戏

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143788449 HTML5实现俄罗斯方块小游戏&#x…

从北美火到中国,大数据洞察品牌“STANLEY”的突围之路

保守直筒大头的“硬汉”外形&#xff0c;以百变颜色踩中时尚命脉&#xff0c;与各路大牌“梦幻联动”&#xff0c;不少时尚弄潮儿没能逃过其“真香”诱惑。 这就是今年以来从北美火到中国的STANLEY&#xff0c;在“巨无霸”水杯中突围出属于自己的一条路。 最近STANLEY又整活…