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渲染后执行,并且是异步的,不会阻塞浏览器。
和类组件中的生命周期函数 componentDidMount 和 componentDidUpdate 的区别:
它们是同步执行的;在得到真实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,介绍作用介绍 2,注意点2.1,参数1,副作用函数2.1.1,运行时间点2.1.2,返回值2.1.3,闭包的影响2.1.4,严禁出现在代码块中(判断,循环)2.1.5&am…...
算法竞赛一句话解题经典问题分析 ©ntsc 2024
原名:算法竞赛一句话解题&经典问题分析 ©ntsc 2024 处理进度 绿:P1381【~P(今日进度)】蓝:P1099 致CSDN网友: 本文章不定期更新!文章链接: 经典问题分析 基础知识与编程…...
【TensorFlow深度学习】强化学习中的贝尔曼方程及其应用
强化学习中的贝尔曼方程及其应用 强化学习中的贝尔曼方程及其应用:理解与实战演练贝尔曼方程简介应用场景代码实例:使用Python实现贝尔曼方程求解状态价值结语 强化学习中的贝尔曼方程及其应用:理解与实战演练 在强化学习这一复杂而迷人的领…...
牛客 NC129 阶乘末尾0的数量【简单 基础数学 Java/Go/PHP/C++】
题目 题目链接: https://www.nowcoder.com/practice/aa03dff18376454c9d2e359163bf44b8 https://www.lintcode.com/problem/2 思路 Java代码 import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改ÿ…...
【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不会进入版本库,被版本库忽略的,只有自己创建一个helpers辅助函数。 可以在任意文件下创建helpers.php文件,建议在app目录下, 然后在composer.json文件中,autoload 中间,…...
LLVM Cpu0 新后端6
想好好熟悉一下llvm开发一个新后端都要干什么,于是参考了老师的系列文章: LLVM 后端实践笔记 代码在这里(还没来得及准备,先用网盘暂存一下): 链接: 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中,getBean(Class<T> requiredType)方法可以接受一个类类型参数,这个参数可以是接口类也可以是实现类。 使用接口类: 如果requiredType是一个接口,…...
自然语言处理(NLP)—— 自动摘要
自动摘要是一种将长文本信息浓缩为短文本的技术,旨在保留原文的主要信息和意义。 1 自动摘要的第一种方法 它的第一种方法是基于理解的,受认知科学和人工智能的启发。 在这个方法中,我们首先建立文本的语义表示,这可以理解为文本…...
Spring RestClient报错:400 Bad Request : [no body]
我项目采用微服务架构,所以各服务之间通过Spring RestClient远程调用,本来一直工作得好好的,昨天突然发现远程调用一直报错,错误详情如下: org.springframework.web.client.HttpClientErrorException$BadRequest: 400…...
【数据结构】 -- 堆 (堆排序)(TOP-K问题)
引入 要学习堆,首先要先简单的了解一下二叉树,二叉树是一种常见的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。它具有以下特点: 根节点(Root):树的顶部节…...
C#面:XML与 HTML 的主要区别是什么
C# XML与HTML有以下几个主要区别: 用途不同:XML(eXtensible Markup Language)是一种用于存储和传输数据的标记语言,它的主要目的是描述数据的结构和内容。HTML(HyperText Markup Language)是一…...
java并发-如何保证线程按照顺序执行?
【readme】 使用只有单个线程的线程池(最简单)Thread.join() 可重入锁 ReentrantLock Condition 条件变量(多个) ; 原理如下: 任务1执行前在锁1上阻塞;执行完成后在锁2上唤醒;任务…...
PyCharm中 Fitten Code插件的使用说明一
一. 简介 Fitten Code插件是是一款由非十大模型驱动的 AI 编程助手,它可以自动生成代码,提升开发效率,帮您调试 Bug,节省您的时间,另外还可以对话聊天,解决您编程碰到的问题。 前一篇文章学习了 PyCharm…...
Polar Web【简单】PHP反序列化初试
Polar Web【简单】PHP反序列化初试 Contents Polar Web【简单】PHP反序列化初试思路EXP手动脚本PythonGo 运行&总结 思路 启动环境,显示下图中的PHP代码,于是展开分析: 首先发现Easy类中有魔术函数 __wakeup() ,实现的是对成员…...
树莓派4B 零起点(二) 树莓派 更换软件源和软件仓库
目录 一、准备工作,查看自己的树莓派版本 二、安装HTTPS支持 三、更换为清华源 1、更换Debian软件源 2,更换Raspberrypi软件仓库 四、进行软件更新 接前章,我们的树莓派已经启动起来了,接下来要干的事那就是更换软件源和软件…...
Pytorch 实现目标检测二(Pytorch 24)
一 实例操作目标检测 下面通过一个具体的例子来说明锚框标签。我们已经为加载图像中的狗和猫定义了真实边界框,其中第一个 元素是类别(0代表狗,1代表猫),其余四个元素是左上角和右下角的(x, y)轴坐标(范围…...
如何使用Python中的列表解析(list comprehension)进行高效列表操作
Python中的列表解析(list comprehension)是一种创建列表的简洁方法,它可以在单行代码中执行复杂的循环和条件逻辑。列表解析提供了一种快速且易于阅读的方式来生成新的列表。 以下是一些使用列表解析进行高效列表操作的示例: 1.…...
java使用websocket遇到的问题
java使用websocket的bug 1 websocket连接正常但是收不到服务端发出的消息java的websocket并发的时候导致连接断开(看着连接是正常的,但是实际上已经断开) 1 websocket连接正常但是收不到服务端发出的消息 java的websocket并发的时候导致连接断…...
Vulkan与OpenGL深度解析——现代图形渲染的技术演进
1. 从OpenGL到Vulkan:图形渲染的进化之路 还记得我第一次接触图形编程时,OpenGL就像一位和蔼的老教授,把复杂的GPU操作封装成简单的API调用。但随着项目复杂度提升,我逐渐发现这位"老教授"的教学方式有些过时——它隐藏…...
XUnity.AutoTranslator:Unity游戏翻译解决方案的创新方法 | 玩家与开发者实战指南
XUnity.AutoTranslator:Unity游戏翻译解决方案的创新方法 | 玩家与开发者实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾因语言障碍错失优秀的外语游戏?是否在尝…...
5G核心网UDR深度解析:从签约数据管理到策略数据存储的完整流程
5G核心网UDR深度解析:从签约数据管理到策略数据存储的完整流程 在5G核心网(5GC)架构中,统一数据仓储功能(UDR)扮演着数据中枢的角色。作为电信级网络的关键组件,UDR不仅需要处理海量用户数据的实…...
Redis 集群模式:核心问题与深度运维指南
前言:为什么要写这篇笔记?在最近的一次技术面试中,面试官问到了“Redis 集群模式下的常见问题及解决方案”。坦白说,虽然我在项目中一直使用 Redis,但由于现有的业务规模尚未达到触发集群极端瓶颈的程度,导…...
3大创新突破让千元机械臂媲美工业级性能:Faze4开源六轴机器人DIY全指南
3大创新突破让千元机械臂媲美工业级性能:Faze4开源六轴机器人DIY全指南 【免费下载链接】Faze4-Robotic-arm All files for 6 axis robot arm with cycloidal gearboxes . 项目地址: https://gitcode.com/gh_mirrors/fa/Faze4-Robotic-arm 价值定位ÿ…...
技术驱动B端拓客升级:号码核验行业的痛点突围与发展新路径,氪迹科技核验筛选算法系统,法人股东核验,阶梯式价格
在B端市场竞争愈发精细化的当下,拓客工作的核心竞争力已从“广撒网”转向“精准触达”,而企业核心决策人的有效联系方式,正是精准拓客的关键载体。号码核验作为拓客流程的前置核心环节,直接决定着拓客投入的回报效率,更…...
PDF24 Creator离线版隐藏技巧:5个连官网都没说的自动化妙用
PDF24 Creator离线版隐藏技巧:5个连官网都没说的自动化妙用 如果你经常需要处理PDF文档,可能已经听说过PDF24 Creator这款免费工具。但大多数人仅仅停留在基础功能的使用上,比如简单的PDF合并、分割或转换。今天我要分享的是PDF24 Creator离线…...
注意力缺陷是什么?主要有哪几种症状及专注力训练方法?
注意力缺陷病因及其对儿童发展的影响分析 注意力缺陷(ADHD)的病因较为复杂,主要涉及遗传、环境和生物因素。研究表明,遗传因素在儿童注意力缺陷中起着重要作用,有些家族中更容易出现多动症状。与此同时,环境…...
中国AI模型调用量领跑全球:成本与开源优势塑造竞争新范式
当前,全球人工智能(AI)领域的竞争正经历着深刻变革。据全球最大AI模型API聚合平台OpenRouter的最新监测数据,中国AI大模型的周调用量已连续数周实现对美国的稳定且显著的超越,并在特定时期内包揽了全球调用量排行榜的前…...
深入解析NAND Flash基础操作与系统集成——从阵列结构到多Die协同
1. NAND Flash基础结构与工作原理 NAND Flash存储器是现代存储系统的核心组件,从U盘到企业级SSD都依赖这项技术。要理解它的强大之处,得先从它的物理结构说起——想象一个巨大的立体停车场,每个停车位就是一个存储单元,而控制电路…...
