「React」useEffect 与 useLayoutEffect 使用与区别

news2024/11/25 20:33:33

前言

useEffect 与 useLayoutEffect 是两个 Hooks,前者比较常用,后者在一些场景下也会用到,下面说明两者区别和应用场景。
在这里插入图片描述

使用

useEffectuseLayoutEffect 是React Hooks里用于处理副作用的钩子(Hooks),它们看起来非常相似,但实际上在何时执行副作用上有细微差别,这影响到了它们的使用场景。

useEffect

useEffect 是在组件渲染到屏幕之后异步执行的。这意味着它不会阻塞浏览器的绘制过程,可以用于大多数副作用场景,比如数据获取、订阅或者手动修改DOM当组件更新后等。

  • 使用场景: 用于大部分没有严格的执行时序要求的副作用操作。
  • 执行时机: 在全部DOM变更完成后,浏览器绘制之后异步执行。
  • 影响: 因为是异步执行,不会阻塞页面的可视化渲染。

useLayoutEffect

useLayoutEffect 的执行时机更接近于类组件的 componentDidMountcomponentDidUpdate 生命周期方法。它在DOM更新完成后同步执行,但在浏览器进行绘制前。

  • 使用场景: 适用于需要同步调整布局的副作用操作。如果需要在DOM变化后立即同步执行一些操作(比如读取DOM布局并同步重绘),就可以用 useLayoutEffect
  • 执行时机: 在所有DOM变更之后同步执行,但在浏览器绘制之前。
  • 影响: 因为阻塞了浏览器的绘制,如果执行复杂或长时间运算,可能会导致性能问题或视觉上的卡顿。

区别

  • 执行时机: useEffect 是异步执行,不会阻塞浏览器的绘制;而 useLayoutEffect 是同步执行,在所有DOM变更之后立即运行,但这会延迟浏览器的绘制。
  • 适用场景: 一般推荐默认使用 useEffect,只有在涉及到需要在布局渲染阶段同步执行的DOM操作或有严格的顺序要求时,才使用 useLayoutEffect

由于 useLayoutEffect 会在绘制前执行,如果操作耗时过长,可能会导致用户感觉到卡顿。因此,除非必要,否则建议优先使用 useEffect

例子

当然可以。这里我会演示一个简单的例子,其中useLayoutEffectuseEffect将有不同的效果。

考虑以下场景:我们有一个要隐藏的消息,并且有一个按钮用于显示这个消息。如果我们使用useLayoutEffect去更改消息状态,用户界面不会显示任何隐藏-再显示的过渡效果,因为所有的更改都是在浏览器绘制之前发生的。相反,如果我们使用useEffect,那么可能会短暂看到消息从隐藏状态变为显示状态的过渡,因为useEffect是在组件渲染和浏览器绘制完成后才执行。

useLayoutEffect的行为

import React, { useLayoutEffect, useState } from 'react';

function LayoutEffectDemo() {
  const [message, setMessage] = useState('这是一条消息');
  const [hidden, setHidden] = useState(true);

  useLayoutEffect(() => {
    if (hidden) {
      setMessage('这是一条消息');
    }
  }, [hidden]);

  return (
    <div>
      {!hidden && <p>{message}</p>}
      <button onClick={() => setHidden(false)}>显示信息</button>
    </div>
  );
}

在这个例子中,“这是一条消息”将会在按钮点击后立即正确显示,用户不会看到任何视觉变化之前消息的状态。

useEffect的行为

现在,我们用相同的例子但用useEffect来替代useLayoutEffect

import React, { useEffect, useState } from 'react';

function EffectDemo() {
  const [message, setMessage] = useState('');
  const [hidden, setHidden] = useState(true);

  useEffect(() => {
    if (hidden) {
      setMessage('这是一条消息');
    }
  }, [hidden]);

  return (
    <div>
      {!hidden && <p>{message}</p>}
      <button onClick={() => setHidden(false)}>显示信息</button>
    </div>
  );
}

在使用useEffect的版本中,按钮点击后状态更新会导致组件的一个渲染周期,在这个周期中消息是隐藏的。然后useEffect会在这个渲染周期之后运行,并且消息会变成可见的。这个过程虽然非常快,但理论上可以被用户观察到,这就是为什么有的时候你会看到界面闪烁。

每一个钩子都有其用例,而显示不必要的用户界面变化(闪烁等)是应该避免的,通常是通过useLayoutEffect来处理,因为它在所有DOM变动之后同步执行,而且在浏览器进行绘制之前,从而保证用户看不到中间状态。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单机一天轻松300+ 最新微信小程序拼多多+京东全自动掘金项目、

现代互联网经济的发展带来了新型的盈利方式&#xff0c;这种方法通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;以此给商家带来增加的流量&#xff0c;同时为使用者带来利润。实践这一手段无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被…

自定义一个SpringBoot场景启动器

前言 一个刚刚看完SpringBoot自动装配原理的萌新依据自己的理解写下的文章&#xff0c;如有大神发现错误&#xff0c;敬请斧正&#xff0c;不胜感激。 分析SpringBoot自动配置原理 SpringBoot的启动从被SpringBootApplication修饰的启动类开始,SpringBootApplicaiotn注解中最…

单片机LCD1602显示电子时钟设计

基于52单片机电子时钟的设计 摘要 本次设计的多功能时钟系统采用STC89C52单片机为核心器件&#xff0c;利用其定时器/计数器定时和记数的原理&#xff0c;结合液晶显示电路、时钟芯片DS1302电路、电源电路以及按键电路来设计计时器。将软硬件有机地结合起来&#xff0c;使得系…

十一、Python循环语句「长期更新Python简单入门到适用」

在python中&#xff0c;它的循环语句有 for 与 while 1、while循环 在python 中 while 语句的一般形式&#xff1a; while 判断条件 : 声明 同样需要注意冒号和缩进。另外&#xff0c;在Python中没有 do..while 循环。 以下实例使用了 while 来计算 1 到 50 的总和&#…

Adobe Camera Raw 11 for Mac/win:摄影后期处理的革命性飞跃

在数字摄影的世界里&#xff0c;RAW格式以其未压缩的原始数据特性&#xff0c;为摄影师提供了更大的后期处理空间。而Adobe Camera Raw 11&#xff0c;作为这一领域的翘楚&#xff0c;以其卓越的性能和创新的功能&#xff0c;为摄影师们带来了前所未有的创作体验。 Adobe Came…

全网最全网络基础思维导图合集(38张)

计算机网络基础知识点多且杂&#xff0c;想要系统地学习&#xff0c;思维导图肯定是必不可少的。 今天整理了38张思维导图&#xff0c;帮助你轻松理清思路&#xff0c;快速掌握关键内容。建议你收藏起来慢慢看&#xff0c;在看过之后最好能重新动手画一画&#xff0c;让计算机…

如何使用DotNet-MetaData识别.NET恶意软件源码文件元数据

关于DotNet-MetaData DotNet-MetaData是一款针对.NET恶意软件的安全分析工具&#xff0c;该工具专为蓝队研究人员设计&#xff0c;可以帮助广大研究人员轻松识别.NET恶意软件二进制源代码文件中的元数据。 工具架构 当前版本的DotNet-MetaData主要由以下两个部分组成&#xf…

element-ui 前端ui框架用法开发指南(2024-05-22)

Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 1、npm安装 // npm安装&#xff1a;npm install element-ui --save 能更好地和 webpack 打包工具配合使用 2、cdn在线引入 访问最新版本的资源地址 - element-uiThe CDN for element-u…

C#解析JSON的常用库--Newtonsoft.Json

一、库介绍 在C#中&#xff0c;解析JSON的常用库有Newtonsoft.Json&#xff08;也称为Json.NET&#xff09;和 System.Text.Json&#xff08;从 .NET Core 3.0 开始引入&#xff09;。本文主要介绍 Newtonsoft.Json。 二、下载 官网&#xff1a; https://www.nuget.org/pack…

C语言之指针进阶(3),函数指针

目录 前言&#xff1a; 一、函数指针变量的概念 二、函数指针变量的创建 三、函数指针变量的使用 四、两段特殊代码的理解 五、typedef 六、函数指针数组 总结&#xff1a; 前言&#xff1a; 本文主要讲述C语言指针中的函数指针&#xff0c;包括函数指针变量的概念、创建…

简易进程池的实现

什么是进程池&#xff1f; 进程池&#xff08;Process Pool&#xff09;是一种用于管理和复用多个进程的技术或设计模式。在进程池中&#xff0c;一定数量的进程会被预先创建并保持在内存中&#xff0c;以便在需要时立即使用&#xff0c;而不是每次需要进程时都重新创建新的进程…

同名在线查询系统微信小程序源码下载支持多种流量主,附带系统教程

同名在线查询系统微信小程序源码下载支持多种流量主这是一款支持查询同名的一款微信小程序 该款小程序支持多种查询模式 重名查询&#xff0c;热度查询&#xff0c;概率香查询 源码免费下载地址抄笔记(chaobiji.cn)

LaTex 模板 - 东北师范大学申研申博推荐信

文章目录 NENU-Letter-Template项目地址示例特性项目结构如何使用main.texletterContent.tex 如何编译方式 1 &#xff1a;在线编译方式 2 &#xff1a;本地编译 参考 NENU-Letter-Template NENU’s recommendation letter template. 东北师范大学推荐信模板 项目地址 GitHu…

Linux驱动设备导论(1)

最近本人在学习Linux驱动&#xff0c;本系列教程是本人在一边学习&#xff0c;一边总结的系列教程&#xff0c;希望能够给很多刚学驱动小伙伴一些总结。 1.Linux设备分类 驱动针对的对象是存储器和外设&#xff0c;不是针对CPU&#xff0c;可以分为以下三大类&#xff1a; 1.…

WordPress Country State City Dropdown CF7插件 SQL注入漏洞复现(CVE-2024-3495)

0x01 产品简介 Country State City Dropdown CF7插件是一个功能强大、易于使用的WordPress插件,它为用户在联系表单中提供国家、州/省和城市的三级下拉菜单功能,帮助用户更准确地填写地区信息。同时,插件的团队和支持也非常出色,为用户提供高质量的服务。 0x02 漏洞概述 …

统计信号处理基础 习题解答10-4

题目&#xff1a; 重复习题10.3&#xff0c;但条件PDF变为&#xff1a; 以及均匀先验。如果非常大&#xff0c;这样先验知识很少&#xff0c;则会出现什么情况。 解答&#xff1a; 如果记 那么&#xff0c;根据条件独立性质&#xff0c;得到&#xff1a; 其中&#xff0c;&am…

蛮力法0/1背包问题实验

实验项目1 蛮力法 实验题目 使用蛮力法解决0/1背包问题。 ​ 问题描述&#xff1a;给定n个重量(weight)为{w1, w2, … ,wn}、价值(key)为{v1, v2, … ,vn}的物品和一个**容量为C(contain)**的背包&#xff0c;求这些物品中的一个最有价值的子集&#xff0c;且要能够装到背包中…

【活动】开源与闭源大模型:探索未来趋势的双轨道路

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 开源与闭源大模型&#xff1a;探索未来趋势的双轨道路引言一、开源大模型&#…

搭建访问阿里云百炼大模型环境

最近这波大降价&#xff0c;还有限时免费&#xff0c;还不赶快试试在线大模型&#xff1f;下面整理访问百炼平台的千问模型方法。 创建RAM子账号并授权 创建RAM子账号 1. “访问控制RAM”入口&#xff08;控制台URL&#xff09; 然后点击进入“RAM管理控制台” 2. 添加用户 …

ASP+ACCESS多功能论坛程序设计

摘 要 随着计算机的广泛应用&#xff0c;人们已经对网络不再感到陌生。在科技飞速发展的今天&#xff0c;电脑信息技术与各行各业进行了有效的结合。人们在网上可以进行网上购物&#xff0c;网上交友&#xff0c;电子商务&#xff0c;网络营效等等。面对强大的网络功能&#x…