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. 高精度分割领域简介✨✨ 图像分割是计算机视觉中的核心任务之一,其目标是将图像划分为多个语义区域,并为…...
PixelMentor:一个开源网站 · 调用AI视觉能力分析图片 · 提供影视后期修改意见托
1. 前言 本文详细介绍如何使用 kylin v10 iso 文件构建出 docker image,docker 版本为 20.10.7。 2. 构建 yum 离线源 2.1. 挂载 ISO 文件 mount Kylin-Server-V10-GFB-Release-030-ARM64.iso /media 2.2. 添加离线 repo 文件 在/etc/yum.repos.d/下创建kylin-local…...
Qwen3-Reranker-0.6B保姆级教程:从零部署到API调用,手把手教你搭建排序系统
Qwen3-Reranker-0.6B保姆级教程:从零部署到API调用,手把手教你搭建排序系统 1. 环境准备与快速部署 1.1 系统要求与准备工作 在开始部署Qwen3-Reranker-0.6B之前,请确保你的系统满足以下基本要求: 操作系统:推荐使…...
探索XScene-UEPlugin:如何实现高斯泼溅模型在虚幻引擎5中的高效可视化与混合渲染
探索XScene-UEPlugin:如何实现高斯泼溅模型在虚幻引擎5中的高效可视化与混合渲染 【免费下载链接】XScene-UEPlugin A Unreal Engine 5 (UE5) based plugin aiming to provide real-time visulization, management, editing, and scalable hybrid rendering of Guas…...
Windows 11安装难题终极解决方案:MediaCreationTool.bat一键绕过硬件限制
Windows 11安装难题终极解决方案:MediaCreationTool.bat一键绕过硬件限制 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreation…...
MetaTube插件:如何为你的Jellyfin/Emby媒体库注入智能元数据管理能力?
MetaTube插件:如何为你的Jellyfin/Emby媒体库注入智能元数据管理能力? 【免费下载链接】jellyfin-plugin-metatube MetaTube Plugin for Jellyfin/Emby 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metatube 你是否曾经为Jelly…...
别再被“画皮不画骨”的套壳工具忽悠了!这款纯代码构建的 DrawingML 排版引擎彻底开源!
在当前 AI 办公自动化工具泛滥的时代,绝大多数产品只是在做表层的图像拼接。而 hugohe3/ppt-master 作为一个极客圈爆火的开源项目,彻底重塑了演示文档生成的底层逻辑,成为了开发者首选的 AI生成PPT神器 与 大模型原生可编辑幻灯片排版引擎。…...
告别环境冲突:手把手教你为Flutter 3.7.12与HarmonyOS NEXT搭建纯净的Windows开发环境
告别环境冲突:手把手教你为Flutter 3.7.12与HarmonyOS NEXT搭建纯净的Windows开发环境 在跨平台开发领域,Flutter与HarmonyOS的结合为开发者带来了全新的可能性。然而,当我们需要在已有Android/iOS开发环境的基础上新增鸿蒙支持时࿰…...
5分钟快速上手:智慧树自动刷课插件的终极解决方案
5分钟快速上手:智慧树自动刷课插件的终极解决方案 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 还在为智慧树平台繁琐的网课学习而烦恼吗?智慧…...
金仓KingbaseES数据库运维实战:10个高频SQL命令详解与避坑指南
金仓KingbaseES数据库运维实战:10个高频SQL命令详解与避坑指南 在数据库运维的日常工作中,熟练掌握核心SQL命令是提升效率的关键。作为国产数据库的代表之一,金仓KingbaseES在企业级应用中扮演着重要角色。本文将深入解析10个最常用的运维SQL…...
Java的嵌套类与内部类在闭包实现与内存泄漏方面的差异
Java中的嵌套类与内部类虽然语法相似,但在闭包实现与内存泄漏风险上存在关键差异。理解这些差异对于编写高效、安全的代码至关重要。本文将深入探讨两者的区别,帮助开发者避免常见陷阱。 **闭包实现机制差异** 嵌套类(静态内部类࿰…...
