useLayoutEffect和useEffect有什么区别?

在 React 中,useEffectuseLayoutEffect 是两个用于处理副作用的 Hook。虽然它们在用法上相似,但在执行时间和适用场景上有显著的区别。以下是对这两个 Hook 的详细比较和解释。

1. 基本概念

useEffect

  • 定义useEffect 是一个 Hook,用于在组件渲染后执行副作用。它通常用于数据获取、订阅和手动 DOM 操作等场景。
  • 执行时机:在组件渲染完成后,用户可以看到更新后的 UI。这意味着 useEffect 的执行是在浏览器绘制之后,可能会导致视觉更新的延迟。

useLayoutEffect

  • 定义useLayoutEffect 也是一个 Hook,用于处理副作用。它的用途与 useEffect 类似,但会在 DOM 更新后、浏览器绘制之前执行。
  • 执行时机:在所有 DOM 变更完成后,但在浏览器绘制之前。这样,任何由 useLayoutEffect 产生的 DOM 变更都将在浏览器呈现之前完成,从而避免闪烁或不一致的 UI。

2. 执行顺序

useEffect 执行顺序

  1. 组件渲染。
  2. 浏览器绘制更新后的 UI。
  3. 执行 useEffect 中的副作用。

useLayoutEffect 执行顺序

  1. 组件渲染。
  2. 执行 useLayoutEffect 中的副作用。
  3. 浏览器绘制更新后的 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. 兼容性

  • useEffectuseLayoutEffect 都在 React 16.8 及以上版本中可用。
  • useLayoutEffect 在 SSR(服务端渲染)中不会执行,因此在 SSR 场景下使用时需谨慎。

7. 总结与选择

  • 使用 useEffect

    • 对于不需要同步 DOM 更新的副作用。
    • 进行数据获取、事件监听等操作。
    • 适用于性能优化场景,不会阻塞 UI 渲染。
  • 使用 useLayoutEffect

    • 进行需要同步读取和写入 DOM 的操作。
    • 避免闪烁或需要立即反映布局变化的场景。
    • 注意可能对性能产生影响,尽量在必要时使用。

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

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

相关文章

smolagents学习笔记系列(番外一)使用DeepSeek API Key + CodeAgent

这篇文章是在 smolagents 官方教程结束后的番外篇&#xff0c;实现了如何使用 DeepSeek API Key CodeAgent 执行你的提示词。 之所以写这篇文章是因为 smolagents 没有提供 DeepSeek 的模型接口&#xff0c;尽管可以通过 HfApiModel 这个类来指定使用与 DeepSeek 相关的模型&…

20250227使用mount命令挂载飞凌OK3588-C的linux R4的文件系统rootfs.img以备修改

rootrootrootroot-X99-Turbo:~/version/OK3588_Linux_fs/linuxfs$ mv m2/ R4 rootrootrootroot-X99-Turbo:~/version/OK3588_Linux_fs/linuxfs$ sudo mount rootfs.img R4/ rootrootrootroot-X99-Turbo:~/version/OK3588_Linux_fs/linuxfs$ sudo umount R4 20250227使用mount命…

【前端基础】Day 1 HTML

总结&#xff1a; 1. Web标准的构成 2. 基本标签 目录 1. Web标准的构成 2. 基本标签 2.1快捷键 2.2.1标题标签 2.2.2段落和换行标签 2.2.3文本格式化标签 2.2.4div和span标签 2.3.1 图像标签和路径 2.3.2路径 2.3.3超链接标签 2.4注释标签 2.5特殊字符 1. Web标准…

推荐3个背景渐变色的wordpress主题

干净、清爽、背景渐变色的wordpress企业主题 ​ 服务类公司wordpress企业主题https://www.jianzhanpress.com/?p8255 红色大气的wordpress企业主题&#xff0c;适合服务行业的公司搭建企业官方网站使用。 ​ wordpress询盘型独立站主题https://www.jianzhanpress.com/?p8258…

LlamaFactory-webui:训练大语言模型的入门级教程

LlamaFactory是一个开源框架&#xff0c;支持多种流行的语言模型&#xff0c;及多种微调技术&#xff0c;同时&#xff0c;以友好的交互式界面&#xff0c;简化了大语言模型的学习。 本章内容&#xff0c;从如何拉取&#xff0c;我已经搭建好的Llamafactory镜像开始&#xff0…

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…

Python—Excel全字段转json文件(极速版+GUI界面打包)

目录 专栏导读1、背景介绍2、库的安装3、核心代码4、完整代码(简易版)5、进阶版(GUI)总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——…

游戏引擎学习第124天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天&#xff0c;我们已经介绍了多线程的一些基础知识&#xff0c;包括如何创建工作队列以及如何在线程中处理任务。今天&#xff0c;重点是解决那些我们之前没有注意到…

Sqlserver安全篇之_启用TLS即配置SQL Server 数据库引擎以加密连接

官方文档 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/configure-sql-server-encryption?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/manage-certificates?viewsql-server-ver15&pre…

hbase笔记总结1

hbase是nosql的一种&#xff0c;非关系型数据库&#xff0c;not only sql&#xff0c;可处理大规模、高并发的数据&#xff0c;是web2.0以后的产物hbase的扩展性和灵活性更好&#xff0c;而且筛选能力相较于MySQL更优nosql的四大特点&#xff1a; 灵活的数据模型 &#xff08;1…

RabbitMq高级

目录 1.发送者的可靠性 1.1 .生产者重试机制 1.2.生产者确认机制 1.3.实现生产者确认 1.3.1.开启生产者确认 1.3.2.定义ReturnCallback 1.3.3.定义ConfirmCallback 2.MQ的可靠性 2.1.数据持久化 2.1.1.交换机持久化 2.1.2.队列持久化 2.1.3.消息持久化 2.2.LazyQueu…

kafka-web管理工具cmak

一. 背景&#xff1a; 日常运维工作中&#xff0c;采用cli的方式进行kafka集群的管理&#xff0c;还是比较繁琐的(指令复杂&#xff1f;)。为方便管理&#xff0c;可以选择一些开源的webui工具。 推荐使用cmak。 二. 关于cmak&#xff1a; cmak是 Yahoo 贡献的一款强大的 Apac…

Android应用app实现AI电话机器人接打电话

Android应用app实现AI电话机器人接打电话 --安卓AI电话机器人 一、前言 【Dialer3.0智能拨号器】Android版手机app&#xff0c;由于采用蓝牙电话的方式来调用手机SIM卡发起呼叫、接听来电&#xff0c;并接收和处理通话的声音&#xff0c;通常我们以“蓝牙电话方案”来称呼它。 …

docker简介-学习与参考

docker Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。 容器是完全使用沙箱…

【leetcode hot 100 42】接雨水

错误解法&#xff1a;若height[left]>height[right]则代表有坑 class Solution {public int trap(int[] height) {int left 0;int area 0;while(left<height.length-1){// 找坑int right left1;while(right<height.length-1 && height[left]>height[ri…

Octave3D 关卡设计插件

课程参考链接 这位大佬有在视频合集中有详细的讲解&#xff0c;个人体验过&#xff0c;感觉功能很强大 https://www.bilibili.com/video/BV1Kq4y1C72P/?share_sourcecopy_web&vd_source0a41d8122353e3e841ae0a39908c2181 Prefab资源管理 第一步 在场景中创建一个空物体…

llama.cpp 一键运行本地大模型 - Windows

文章目录 llama.cpp 一键运行本地大模型 - Windows嘿&#xff0c;咱来唠唠 llama.cpp 这玩意儿&#xff01;gguf 格式是啥&#xff1f;咱得好好说道说道基座模型咋选&#xff1f;所需物料&#xff0c;咱得准备齐全咯核心命令&#xff0c;得记牢啦运行方式咋选&#xff1f;测试应…

SQLark 数据迁移|断点续迁已上线(Oracle-达梦)

数据迁移是 SQLark 最受企业和个人用户欢迎的功能之一&#xff0c;截止目前已帮助政府、金融、能源、通信等 50 家单位完成从 Oracle、MySQL 到达梦的全量迁移&#xff0c;自动化迁移成功率达 96% 以上。 在 Oracle 到达梦数据库迁移过程中&#xff0c;SQLark V3.3 新增 断点续…

sklearn中的决策树-分类树:剪枝参数

剪枝参数 在不加限制的情况下&#xff0c;一棵决策树会生长到衡量不纯度的指标最优&#xff0c;或者没有更多的特征可用为止。这样的决策树 往往会过拟合。为了让决策树有更好的泛化性&#xff0c;我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大&#xff0c;正确的剪枝策…

基于SSM实现的bbs论坛系统功能实现四

一、前言介绍&#xff1a; 1.1 项目摘要 随着互联网技术的不断进步和普及&#xff0c;网络社区已成为人们获取信息、交流意见、分享经验的重要场所。BBS&#xff08;Bulletin Board System&#xff0c;电子公告板系统&#xff09;论坛系统作为网络社区的一种重要形式&#xf…