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

React@16.x(23)useEffect

目录

  • 1,介绍
    • 作用
    • 介绍
  • 2,注意点
    • 2.1,参数1,副作用函数
      • 2.1.1,运行时间点
      • 2.1.2,返回值
      • 2.1.3,闭包的影响
      • 2.1.4,严禁出现在代码块中(判断,循环)
      • 2.1.5,尽量保持副作用函数稳定
    • 2.2,参数2,数组

1,介绍

作用

用于在函数组件内,处理副作用,比如:

  • ajax 请求
  • 计时器
  • 其他异步操作
  • 更改真实DOM对象
  • 本地存储
  • 其他会对外部产生影响的操作(和自身无关)。

介绍

useEffect 接收2个参数,

  • 参数1,一个函数。在该函数中执行副作用。
  • 参数2(可选),一个数组。记录参数1中使用到的依赖。
import React, { useEffect, useState } from "react";export default function App() {const [n, setN] = useState(0);useEffect(() => {document.title = `数字:${n}`;});return (<div><span>{n}</span><buttononClick={() => {setN(n + 1);}}>加一</button></div>);
}

2,注意点

2.1,参数1,副作用函数

2.1.1,运行时间点

在页面完成真实UI渲染后执行,并且是异步的,不会阻塞浏览器。

和类组件中的生命周期函数 componentDidMountcomponentDidUpdate区别

它们是同步执行的;在得到真实DOM后,用户还没有看到真实UI渲染时执行。

2.1.2,返回值

要么没有返回值,如果有必须是一个函数。该函数称为清理函数

type EffectCallback = () => void | (() => void);;

清理函数的特点:

  • 首次渲染不会执行,组件销毁一定执行;
  • 再次渲染时,会在副作用函数之前运行。

所以,一般会在清理函数中,清理副作用函数开启的计时器。

import React, { useEffect, useState } from "react";function Child() {useEffect(() => {let timer = null;let n = 10;timer = setInterval(() => {console.log(n--);}, 1000);return () => {clearInterval(timer);};});return <div>子组件</div>;
}export default function App() {const [visible, setVisible] = useState(true);return (<div>{visible && <Child />}<buttononClick={() => {setVisible(!visible);}}>显示/隐藏</button></div>);
}

2.1.3,闭包的影响

在副作用函数中,如果使用了函数组件上下文中的变量,受闭包影响,会导致副作用函数中的变量不会实时变化

原理和闭包的经典问题一样,不同点是这里的 n 是一个状态

也就是说,每次函数组件重新调用,计时器的回调函数使用的都是当次函数组件调用时产生的新值( 相当于计时器中使用了传递的参数)。

所以每次开启新计时器时,n 都不一样。

export default function App() {const [n, setN] = useState(10);useEffect(() => {setTimeout(() => {console.log(n);}, 3000);});return (<div><buttononClick={() => {setN(n - 1);}}>n-1</button></div>);
}

3s 后打印,所以在3s内连续点击按钮3次,3s后会先打印出 10(首次渲染),再依次打印出 9 8 7

2.1.4,严禁出现在代码块中(判断,循环)

原理和 useState 类似,这样写会导致无法正确获取要执行的副作用函数。

2.1.5,尽量保持副作用函数稳定

副作用函数在每次(重新渲染)注册时,会覆盖掉之前的副作用函数,因此,尽量保持副作用函数稳定,否则控制起来会比较复杂。

2.2,参数2,数组

作用:记录副作用函数的依赖数据。当组件重新渲染后,如果新旧依赖数据不一致(Object.is() 判断),才会执行副作用函数。

类似于 Vue3 中的 watcheffect。

所以,如果依赖数据没有发生变化,则:

  • 副作用函数仅在组件第一次渲染后执行;
  • 清理函数仅在组件卸载时执行。

参数2传递空数组就能实现依赖不发生变化。

useEffect(() => {console.log('副作用函数执行');return () => {console.log('清理函数执行');}
}, [])

比如请求列表数据,当前页码 page 和每页展示个数 limit 发生变化时,再请求接口:

useEffect(() => {(async function () {const resp = await getList(page, limit);// 获取 list 和 total})();
}, [page, limit])

以上。

相关文章:

React@16.x(23)useEffect

目录 1&#xff0c;介绍作用介绍 2&#xff0c;注意点2.1&#xff0c;参数1&#xff0c;副作用函数2.1.1&#xff0c;运行时间点2.1.2&#xff0c;返回值2.1.3&#xff0c;闭包的影响2.1.4&#xff0c;严禁出现在代码块中&#xff08;判断&#xff0c;循环&#xff09;2.1.5&am…...

算法竞赛一句话解题经典问题分析 ©ntsc 2024

原名&#xff1a;算法竞赛一句话解题&经典问题分析 ©ntsc 2024 处理进度 绿&#xff1a;P1381【~P&#xff08;今日进度&#xff09;】蓝&#xff1a;P1099 致CSDN网友&#xff1a; 本文章不定期更新&#xff01;文章链接&#xff1a; 经典问题分析 基础知识与编程…...

【TensorFlow深度学习】强化学习中的贝尔曼方程及其应用

强化学习中的贝尔曼方程及其应用 强化学习中的贝尔曼方程及其应用&#xff1a;理解与实战演练贝尔曼方程简介应用场景代码实例&#xff1a;使用Python实现贝尔曼方程求解状态价值结语 强化学习中的贝尔曼方程及其应用&#xff1a;理解与实战演练 在强化学习这一复杂而迷人的领…...

牛客 NC129 阶乘末尾0的数量【简单 基础数学 Java/Go/PHP/C++】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8 https://www.lintcode.com/problem/2 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff…...

【Spring Boot】异常处理

异常处理 1.认识异常处理1.1 异常处理的必要性1.2 异常的分类1.3 如何处理异常1.3.1 捕获异常1.3.2 抛出异常1.3.4 自定义异常 1.4 Spring Boot 默认的异常处理 2.使用控制器通知3.自定义错误处理控制器3.1 自定义一个错误的处理控制器3.2 自定义业务异常类3.2.1 自定义异常类3…...

Laravel学习-自定义辅助函数

因为laravel框架的辅助函数helpers不会进入版本库&#xff0c;被版本库忽略的&#xff0c;只有自己创建一个helpers辅助函数。 可以在任意文件下创建helpers.php文件&#xff0c;建议在app目录下&#xff0c; 然后在composer.json文件中&#xff0c;autoload 中间&#xff0c…...

LLVM Cpu0 新后端6

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…...

GAT1399协议分析(9)--图像上传

一、官方定义 二、wirechark实例 有前面查询的基础,这个接口相对简单很多。 请求: 文本化: POST /VIID/Images HTTP/1.1 Host: 10.0.201.56:31400 User-Agent: python-requests/2.32.3 Accept-Encoding: gzip, deflate Accept: */* Connection: keep-alive content-type:…...

Spring ApplicationContext的getBean方法

Spring ApplicationContext的getBean方法 在Spring框架的ApplicationContext中&#xff0c;getBean(Class<T> requiredType)方法可以接受一个类类型参数&#xff0c;这个参数可以是接口类也可以是实现类。 使用接口类&#xff1a; 如果requiredType是一个接口&#xff0c…...

自然语言处理(NLP)—— 自动摘要

自动摘要是一种将长文本信息浓缩为短文本的技术&#xff0c;旨在保留原文的主要信息和意义。 1 自动摘要的第一种方法 它的第一种方法是基于理解的&#xff0c;受认知科学和人工智能的启发。 在这个方法中&#xff0c;我们首先建立文本的语义表示&#xff0c;这可以理解为文本…...

Spring RestClient报错:400 Bad Request : [no body]

我项目采用微服务架构&#xff0c;所以各服务之间通过Spring RestClient远程调用&#xff0c;本来一直工作得好好的&#xff0c;昨天突然发现远程调用一直报错&#xff0c;错误详情如下&#xff1a; org.springframework.web.client.HttpClientErrorException$BadRequest: 400…...

【数据结构】 -- 堆 (堆排序)(TOP-K问题)

引入 要学习堆&#xff0c;首先要先简单的了解一下二叉树&#xff0c;二叉树是一种常见的树形数据结构&#xff0c;每个节点最多有两个子节点&#xff0c;通常称为左子节点和右子节点。它具有以下特点&#xff1a; 根节点&#xff08;Root&#xff09;&#xff1a;树的顶部节…...

C#面:XML与 HTML 的主要区别是什么

C# XML与HTML有以下几个主要区别&#xff1a; 用途不同&#xff1a;XML&#xff08;eXtensible Markup Language&#xff09;是一种用于存储和传输数据的标记语言&#xff0c;它的主要目的是描述数据的结构和内容。HTML&#xff08;HyperText Markup Language&#xff09;是一…...

java并发-如何保证线程按照顺序执行?

【readme】 使用只有单个线程的线程池&#xff08;最简单&#xff09;Thread.join() 可重入锁 ReentrantLock Condition 条件变量&#xff08;多个&#xff09; &#xff1b; 原理如下&#xff1a; 任务1执行前在锁1上阻塞&#xff1b;执行完成后在锁2上唤醒&#xff1b;任务…...

PyCharm中 Fitten Code插件的使用说明一

一. 简介 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手&#xff0c;它可以自动生成代码&#xff0c;提升开发效率&#xff0c;帮您调试 Bug&#xff0c;节省您的时间&#xff0c;另外还可以对话聊天&#xff0c;解决您编程碰到的问题。 前一篇文章学习了 PyCharm…...

Polar Web【简单】PHP反序列化初试

Polar Web【简单】PHP反序列化初试 Contents Polar Web【简单】PHP反序列化初试思路EXP手动脚本PythonGo 运行&总结 思路 启动环境&#xff0c;显示下图中的PHP代码&#xff0c;于是展开分析&#xff1a; 首先发现Easy类中有魔术函数 __wakeup() &#xff0c;实现的是对成员…...

树莓派4B 零起点(二) 树莓派 更换软件源和软件仓库

目录 一、准备工作&#xff0c;查看自己的树莓派版本 二、安装HTTPS支持 三、更换为清华源 1、更换Debian软件源 2&#xff0c;更换Raspberrypi软件仓库 四、进行软件更新 接前章&#xff0c;我们的树莓派已经启动起来了&#xff0c;接下来要干的事那就是更换软件源和软件…...

Pytorch 实现目标检测二(Pytorch 24)

一 实例操作目标检测 下面通过一个具体的例子来说明锚框标签。我们已经为加载图像中的狗和猫定义了真实边界框&#xff0c;其中第一个 元素是类别&#xff08;0代表狗&#xff0c;1代表猫&#xff09;&#xff0c;其余四个元素是左上角和右下角的(x, y)轴坐标&#xff08;范围…...

如何使用Python中的列表解析(list comprehension)进行高效列表操作

Python中的列表解析&#xff08;list comprehension&#xff09;是一种创建列表的简洁方法&#xff0c;它可以在单行代码中执行复杂的循环和条件逻辑。列表解析提供了一种快速且易于阅读的方式来生成新的列表。 以下是一些使用列表解析进行高效列表操作的示例&#xff1a; 1.…...

java使用websocket遇到的问题

java使用websocket的bug 1 websocket连接正常但是收不到服务端发出的消息java的websocket并发的时候导致连接断开&#xff08;看着连接是正常的&#xff0c;但是实际上已经断开&#xff09; 1 websocket连接正常但是收不到服务端发出的消息 java的websocket并发的时候导致连接断…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...