useLayoutEffect和useEffect有什么区别?
在 React 中,useEffect 和 useLayoutEffect 是两个用于处理副作用的 Hook。虽然它们在用法上相似,但在执行时间和适用场景上有显著的区别。以下是对这两个 Hook 的详细比较和解释。
1. 基本概念
useEffect
- 定义:
useEffect是一个 Hook,用于在组件渲染后执行副作用。它通常用于数据获取、订阅和手动 DOM 操作等场景。 - 执行时机:在组件渲染完成后,用户可以看到更新后的 UI。这意味着
useEffect的执行是在浏览器绘制之后,可能会导致视觉更新的延迟。
useLayoutEffect
- 定义:
useLayoutEffect也是一个 Hook,用于处理副作用。它的用途与useEffect类似,但会在 DOM 更新后、浏览器绘制之前执行。 - 执行时机:在所有 DOM 变更完成后,但在浏览器绘制之前。这样,任何由
useLayoutEffect产生的 DOM 变更都将在浏览器呈现之前完成,从而避免闪烁或不一致的 UI。
2. 执行顺序
useEffect 执行顺序
- 组件渲染。
- 浏览器绘制更新后的 UI。
- 执行
useEffect中的副作用。
useLayoutEffect 执行顺序
- 组件渲染。
- 执行
useLayoutEffect中的副作用。 - 浏览器绘制更新后的 UI。
示例
import React, { useEffect, useLayoutEffect } from 'react';const Example = () => {useEffect(() => {console.log('useEffect 执行');}, []);useLayoutEffect(() => {console.log('useLayoutEffect 执行');}, []);return <div>示例组件</div>;
};export default Example;
在上面的示例中,useLayoutEffect 会在 DOM 更新后立即执行,而 useEffect 会等到浏览器绘制后才能执行。
3. 适用场景
使用 useEffect 的场景
- 数据获取:当需要从服务器获取数据并更新状态时。
- 事件监听:添加或移除事件监听器。
- 定时器:设置和清除定时器。
- 不影响布局的副作用:例如,更新状态不会影响到布局的副作用。
使用 useLayoutEffect 的场景
- 同步 DOM 读写:在需要读取 DOM 布局并立即写入的场景,例如在计算元素的宽度和高度时。
- 避免闪烁:在需要避免视觉闪烁的情况下,例如在动态调整样式或类名时。
- 动画:在进行动画时,需要在绘制之前进行 DOM 更新。
示例
使用 useEffect 进行数据获取
import React, { useEffect, useState } from 'react';const DataFetchingComponent = () => {const [data, setData] = useState(null);useEffect(() => {const fetchData = async () => {const response = await fetch('https://api.example.com/data');const result = await response.json();setData(result);};fetchData();}, []);return <div>{data ? JSON.stringify(data) : '加载中...'}</div>;
};
使用 useLayoutEffect 进行布局计算
import React, { useLayoutEffect, useRef } from 'react';const LayoutEffectComponent = () => {const divRef = useRef(null);useLayoutEffect(() => {const height = divRef.current.clientHeight;console.log('当前高度:', height);// 这里可以进行一些同步的 DOM 操作}, []);return <div ref={divRef}>这个组件的高度会被计算</div>;
};
4. 性能影响
useEffect 性能
- 性能较好:由于
useEffect在浏览器绘制后执行,因此不会阻塞浏览器的绘制过程。这使得它在执行较长的副作用时不会影响用户体验。
useLayoutEffect 性能
- 可能影响性能:
useLayoutEffect会阻塞浏览器的绘制过程,因此如果其中的副作用执行较慢,可能导致 UI 卡顿或延迟。要谨慎使用,确保它的副作用不会影响性能。
5. 清理副作用
两者都支持清理副作用的功能。返回一个清理函数可以在组件卸载或依赖项变化时执行清理。
示例
useEffect(() => {const timer = setTimeout(() => {console.log('定时器执行');}, 1000);return () => clearTimeout(timer); // 清理定时器
}, []);useLayoutEffect(() => {const resizeHandler = () => {console.log('窗口大小变化');};window.addEventListener('resize', resizeHandler);return () => {window.removeEventListener('resize', resizeHandler); // 清理事件监听器};
}, []);
6. 兼容性
useEffect和useLayoutEffect都在 React 16.8 及以上版本中可用。useLayoutEffect在 SSR(服务端渲染)中不会执行,因此在 SSR 场景下使用时需谨慎。
7. 总结与选择
-
使用
useEffect:- 对于不需要同步 DOM 更新的副作用。
- 进行数据获取、事件监听等操作。
- 适用于性能优化场景,不会阻塞 UI 渲染。
-
使用
useLayoutEffect:- 进行需要同步读取和写入 DOM 的操作。
- 避免闪烁或需要立即反映布局变化的场景。
- 注意可能对性能产生影响,尽量在必要时使用。
相关文章:
useLayoutEffect和useEffect有什么区别?
在 React 中,useEffect 和 useLayoutEffect 是两个用于处理副作用的 Hook。虽然它们在用法上相似,但在执行时间和适用场景上有显著的区别。以下是对这两个 Hook 的详细比较和解释。 1. 基本概念 useEffect 定义:useEffect 是一个 Hook&…...
Docker迁移/var/lib/docker之后镜像容器丢失问题
迁移/var/lib/docker时,如果目标目录少写一个/,/etc/docker/daemon.json中的data-root后面需要多加一级目录docker。 若迁移命令如下 rsync -avz /var/lib/docker /home/docker/ 在/etc/docker/daemon.json中添加如下内容 "data-root": &q…...
ProfiNet转EtherCAT 网关:助力工业设备 “对话”的神奇纽带
在工业自动化的世界里,通信协议就像不同的语言,而稳联技术ProfiNet转EtherCAT网关(WL-PN-ECATM)则是那个精通多国语言的“翻译官”。它不仅能打破协议壁垒,还能让设备之间的沟通更加高效、精准。今天,我们就…...
TCP基本入门-简单认识一下什么是TCP
部分内容来源:小林Coding TCP的特点 1.面向连接 一定是“一对一”才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的 2.可靠的 无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个…...
本地快速搭建一套AI人脸识别技术研究学习的实验环境
如果你想在本地搭建一套学习和研究AI人脸识别技术的框架,建议使用开源工具和框架进行实验,因为它们通常提供了较为丰富的文档和社区支持,能够帮助你深入理解人脸识别的核心原理。以下是一套可行性强且综合性的方案,涵盖了人脸检测…...
DeepSeek:面向效率与垂直领域的下一代大语言模型技术解析
本文将深入剖析DeepSeek模型的核心算法架构,揭示其在神经网络技术上的突破性创新,并与主流大模型进行全方位技术对比。文章涵盖模型设计理念、训练范式优化、应用场景差异等关键维度,为读者呈现大语言模型领域的最新发展图景。 一、DeepSeek…...
【easy视频 | day01】项目了解 + 登录注册 + 使用 token 作为客户端请求令牌
文章目录 前言完成任务1. 项目了解2. 登录注册2.1 创建数据表2.2 验证码如果使用 Session 存储验证码:不用 Session 存储验证码,用 Redis 会有什么问题? 2.3 注册功能2.4 登录功能2.5 自动登录2.6 退出登录 总结 前言 本项目非原创,我只是个…...
使用elasticdump导出/导入 -- ES数据
导出指定索引数据到指定文件夹: ./elasticdump --inputhttp://用户:密码IP:9201/索引名字 --output导出路径/out.json --typedata 将导出的文件导入 ./elasticdump --input路径/out.json --outputhttp://账号:密码IP:9201/索引名称 --typedata --fileTypejson 【el…...
React + TypeScript 复杂布局开发实战
React TypeScript 复杂布局开发实战 一、项目架构设计(基于最新技术栈) 1.1 技术选型与工程创建 # 使用Vite 5.x React 19 TypeScript 5.4 npx create-vitelatest power-designer-ui --template react-ts cd power-designer-ui && npm inst…...
工业AR眼镜的‘芯’动力:FPC让制造更智能【新立电子】
随着增强现实(AR)技术的快速发展,工业AR智能眼镜也正逐步成为制造业领域的重要工具。它不仅为现场工作人员提供了视觉辅助,还极大地提升了远程协助的效率、优化了仓储管理。新立电子其高性能的FPC产品在AI眼镜中的应用,…...
mapbox实现添加历史轨迹,并进行动画播放效果
1、引入播放插件类 https://download.csdn.net/download/qq_48795482/90437319 2、添加图层 drawRouteLine(resData, layerType) {console.log("调用了轨迹线函数", resData);var jsondata {type: "FeatureCollection",features: [],};var linejsondat…...
最好Wordpree+Apache+PHP安装教程
前提需要 PHP的安装最少需要7.4以上Mysql的安装,直接默认最新版就行APache服务器(HTTP服务器,只有用这个你的软件才能在服务器上运行) 安装apache 安装 sudo apt install apache2查看防火墙 sudo ufw app list如果有 Apache那…...
Windows搭建jenkins服务
jenkins下载 官网:https://www.jenkins.io 中文文档:Jenkins 直接可下载网址:Jenkins 的安装和设置 安装前准备 在安装 jenkins 之前要先确保电脑上是否已配置过 Java 的环境变量,可调出命令窗口(win R 再输入 cmd&…...
鸿蒙-AVPlayer
compileVersion 5.0.2(14) 音频播放 import media from ohos.multimedia.media; import common from ohos.app.ability.common; import { BusinessError } from ohos.base;Entry Component struct AudioPlayer {private avPlayer: media.AVPlayer | nu…...
解决单元测试 mock final类报错
文章目录 前言解决单元测试 mock final类报错1. 报错原因2. 解决方案3. 示例demo4. 扩展 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。 而且听说点赞的人每天的运气都不会太差࿰…...
Kafka消费者相关
Kafka生产者相关-CSDN博客 消费者消费数据基本流程 package com.hrui;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; import org.apache…...
Vue nextTick原理回顾
nextTick就是将异步函数放在下一次实践循环的微任务队列中执行 实现原理比较简单,极简版本: function myNextTick(cb){let p;pPromise.resolve().then(cb)return cb?p:Promise.resolve() }复杂版本,考虑异步函数入队、执行锁、兼容处理 l…...
JavaWeb登录认证
在Web系统中,如果没有登录功能和登录认证,是可以直接访问到Web系统的后台的。 这是不安全的,所以我们今天的主题就是登录认证。最终要实现的效果是: 如果用户名密码错误,不允许登录系统。如果用户名和密码都正确&…...
半导体制造工艺(二)光刻工艺—掩模版
在上文中我们已经简单概述了光刻工艺的大致流程。接下来将会介绍在光刻工艺中所需用到的必备材料以及设备。例如掩模版、光刻胶、匀胶机、光刻机等等。由于需要保持讲述工艺的完整性以及流畅,每一个都需要涉及,所以每次仅是侧重点不同。此篇主要讲述的是…...
计算机视觉算法实战——高精度分割(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 高精度分割领域简介✨✨ 图像分割是计算机视觉中的核心任务之一,其目标是将图像划分为多个语义区域,并为…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
GO协程(Goroutine)问题总结
在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...
