useEffect 与 useLayoutEffect 的区别

news/2024/10/7 18:36:01/

useEffect 与 useLayoutEffect 的区别

      • useEffect和useLayoutEffect是处理副作用的React钩子函数,有以下区别
        • 1. 执行时机不同
        • 2. 对性能影响不同
        • 3. 对渲染的影响不同:
        • 4. 使用场景不同
      • 使用建议

useEffect和useLayoutEffect是处理副作用的React钩子函数,有以下区别

1. 执行时机不同
  • useEffect:在组件渲染到屏幕之后异步执行。这意味着它不会阻塞浏览器的绘制和更新,适用于大多数与数据获取、订阅事件、手动修改DOM等不会直接影响页面布局和视觉呈现的操作。
  • useLayoutEffect:会在浏览器进行布局和绘制之前同步执行。useLayoutEffect中执行的操作会修改DOM样式或结构,并且在浏览器绘制之前就完成这些修改,避免页面的重绘和回流带来的性能问题。

    注意:useLayoutEffect是在DOM结构更新后、渲染前执行,在渲染时是同步执行,相当于有一个防抖效果

2. 对性能影响不同
  • useEffect:由于是异步执行,不会阻塞页面的渲染,对用户交互的响应性影响较小,但如果副作用操作耗时较长,可能会在用户操作后有短暂的延迟才看到效果。
  • useLayoutEffect:由于是同步执行,如果在其中执行的操作耗时较长,会阻塞页面的渲染,可能导致页面卡顿,影响用户体验。
3. 对渲染的影响不同:
  • useEffect 的执行不会阻塞浏览器的渲染工作
  • useLayoutEffect 的执行可能会阻塞浏览器的渲染,使用 useLayoutEffect 时需要注意性能问题。
4. 使用场景不同
  • 一般情况下,如果副作用操作不会影响页面的布局,建议使用useEffect。例如发送网络请求获取数据、添加事件监听器、更新本地存储等。
  • 如果副作用操作会影响页面的布局和视觉呈现,例如直接修改DOM元素的样式、位置、大小等,为了避免页面的闪烁和重绘,建议用useLayoutEffect

    useLayoutEffect会在浏览器进行布局和绘制之前同步执行。这意味着它可以在 DOM 更新后、浏览器绘制之前进行操作,从而避免由于异步的useEffect可能导致的闪烁现象。

使用建议

  1. 将直接影响页面布局和视觉呈现的操作放在useLayoutEffect中,例如直接修改 DOM 元素的样式、位置、大小等。因为它会等待这些操作完成后再进行渲染,所以可以避免页面的闪烁。
  2. 减少useLayoutEffect中执行的复杂或耗时操作。由于它是同步执行,如果操作过于耗时,可能会阻塞页面的渲染,导致卡顿。如果必须进行复杂计算或耗时操作,可以考虑将其拆分为异步操作,或者在操作完成后再进行必要的 DOM 更新。
  3. 精确管理依赖项,只将会影响布局的变量添加到依赖项数组中。这样可以避免不必要的useLayoutEffect执行。

http://www.ppmy.cn/news/1535817.html

相关文章

华硕天选笔记本外接音箱没有声音

系列文章目录 文章目录 系列文章目录一.前言二.解决方法第一种方法第二种方法 一.前言 华硕天选笔记本外接音箱没有声音,在插上外接音箱时,系统会自动弹出下图窗口 二.解决方法 第一种方法 在我的电脑上选择 Headphone Speaker Out Headset 这三个选项…

【java】数据类型与变量以及操作符

各位看官:如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论,感谢您的支持!!! 目录 一.字面变量: 二:数据类型 1.1:int类型:&#xff0…

谷粒商城のRabbitMQ基础篇

文章目录 前言一、Rabbit MQ简介1、基本概念2、组件架构 二、使用步骤1.引入依赖2.application.properties3、docker 安装Rabbit MQ3、使用案例3.1、定义队列3.2、定义交换机3.3、绑定3.4、发送消息3.5、接受消息3.5、自定义消息序列化方式3.6、演示Fanout 交换机模式3.7、演示…

AI类课程的笔记

信息论、导论、模式识别(数据挖掘)、语义网络与知识图谱、深度学习、强化学习 (零)信息论 详见另一篇博文 信息论自总结笔记(仍然在更新)_信息论也更新了-CSDN博客https://blog.csdn.net/sinat_27382047/article/details/12690…

Spring Boot项目实战教程:快速构建Web应用与RESTful API

目录 一、Spring Boot简介1、Spring Boot的定义2、Spring Boot的优势(1)快速开发(2)自动配置(3)微服务支持(4)无代码生成和XML配置(5)独立运行(6&…

运用MinIO技术服务器实现文件上传——在Linux系统上安装和启动(一)

# MinIO 单机版环境搭建详解 ## 1. 简介 随着大数据时代的到来,数据存储的需求日益增大,如何有效地存储和管理大规模的非结构化数据成为许多企业和开发者面临的挑战。MinIO 作为一个高性能、分布式对象存储系统,致力于为用户提供简单、快速…

帆软SQL参数下拉框设置

1、配置数据库查询 select * from SALES_BASIC where 地区 ‘${dept}’ 2、配置参数 3、展示结果

[python毕业设计]免费分享一套基于Python的Django学生选课系统【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django学生选课系统,分享下哈。 项目视频演示 【免费】基于Python的Django学生选课系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着信息技术的快速发展,学生选课…