React 第十九节 useLayoutEffect 用途使用技巧注意事项详解

news/2024/12/28 20:45:53/

1、概述

useLayoutEffectuseEffect 的一个衍生版本,只是他们的执行时机不同

useLayoutEffect 用于在DOM更新执行完成之后浏览器渲染绘制之前执行,这会阻塞浏览器的渲染;
useEffect 的执行时机是在组件首次渲染和更新渲染之后异步执行的,这就意味着 useEffect 的执行并不会阻塞组件的渲染,也不会影响到用户的交互体验;

由于useEffect 执行的的异步操作,那么在其副作用函数中执行,数据请求DOM操作定时任务,即使有大量的计算耗时,也不会让用户感觉到界面卡顿现象
useLayoutEffect 执行的是同步操作,不适用于大量耗时的进程在副作用函数中执行,否则会是界面显的非常卡顿,从而影响用户的体验感;

useEffect具体使用详情

2、写法

javascript">useLayoutEffect(setup, dependencies)

第一个参数setup,处理副作用的函数,在将组件首次添加到 DOM 之前,React 将运行 setup 函数。在每次因为依赖项变更而重新渲染后,React 将首先使用旧值运行 cleanup 函数(如果你提供了该函数),然后使用新值运行 setup 函数。在组件从 DOM 中移除之前,React 将最后一次运行 cleanup 函数。
第二个参数:依赖项数组,与 useEffect的依赖项一样为可选项;

javascript">useLayoutEffect(() => {console.log('=设置函数==')// 用于根据依赖项变化而执行的逻辑return () => {// 清理函数,组件卸载移除时,执行的逻辑}
},[name])

3、用法示例

当我们使用 useEffect 将一个圆形由直径 10px,变大到 直径为200px时;会看到 图形的变化整个过程
而我们使用 useLayoutEffect 时,直接看到的就是 直接为 200px 的圆形,不会看到图片变化过程,给用户的感觉视图的白屏时间更长,体验不好;

/* index.less文件 */
.base-class{display: block;width: 10px;height: 10px;background-color: #f00;border-radius: 50%;position:relative;
}
.area-box{width: 200px;height: 200px;
}
3.1 使用 useEffect Hook时,

异步执行,不会阻塞浏览器渲染,故可以看见图形变化过程;

javascript">import {useState, useEffect } from 'react'
import './index.less'export default function MyLayoutEffect() {const [area, setArea] = useState(false)const handleChangeArea = () => {setArea(false)}// 使用时间延迟let now = performance.now()while (performance.now() - now < 200) {}useEffect(() => {setArea(true)}, [area])return (<div><span className={area ? 'base-class area-box' : 'base-class'}>useEffect圆的面积</span><hr /><p>areaLayout:---{areaLayout}----</p><hr />  <button onClick={handleChangeArea}>改变圆形面积</button></div>)
}
3.2、使用 useLayoutEffect 时,

无论我们是点击按钮改变原型大小,还是初次加载,屏幕中始终的 直径为 200px 的圆形;这是因为 useLayoutEffect 的状态更新,会在屏幕渲染之前执行,进而导致阻塞渲染,而一直看到都是大图

javascript">import {useState, useLayoutEffect} from 'react'
import './index.less'export default function MyLayoutEffect() {const [areaLayout, setAreaLayout] = useState(false)const handleChangeArea = () => {setAreaLayout(false)}let now = performance.now()while (performance.now() - now < 200) {}useLayoutEffect(() => {setAreaLayout(true)}, [areaLayout])return (<div><p>areaLayout:---{areaLayout}----</p><span className={areaLayout ? 'base-class area-box' : 'base-class'}>useLayoutEffect</span><hr />  <hr /><button onClick={handleChangeArea}>改变圆形面积</button></div>)
}

4、使用场景

1、需要在屏幕渲染完成之前 获取元素DOM位置尺寸,同步进行调整
2、防止闪屏,因useLayoutEffect 会在浏览器渲染前计算好 元素的位置大小,故不会像 useEffect,会看见视图元素 位置大小变化过程,但是如果时间过短,会给用户一种闪屏错觉


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

相关文章

Android APP 集成本地大模型 LLM

这篇文章介绍如何在Android项目中集成大模型LLM&#xff0c;并展示大模型 text-to-text 结果。主要依赖如下2项&#xff1a; MediaPipeGemma 2BMediaPipe Google 在2017年发布了 TensorFlow Lite&#xff0c; 它是一个用于在Mobile和IoT上进行 ML 推断的轻量级框架。主要用于将…

【每日学点鸿蒙知识】hap安装报错、APP转移账号、import本地文件、远程包构建问题、访问前端页面方法

1、HarmonyOS 打包生产的hap&#xff0c;安装报错&#xff0c;如何解决&#xff1f; 通过build打包的hap文件&#xff0c;通过hdc进行安装&#xff0c;提示错误&#xff0c;证书信息确认是release。如何解决&#xff1f; release证书无法用于安装。 2、HarmonyOS 普通账户下…

深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制

深入解析Android Framework中的android.location包:架构设计、设计模式与系统定制 目录 引言android.location包概述核心类解析 LocationManagerLocationProviderLocationCriteriaGpsStatusGpsStatus.ListenerLocationListener位置服务的工作原理位置信息的获取与处理GPS状态…

Linux零基础速成篇一(理论+实操)

前言&#xff1a;本教程适合Linux零基础学习&#xff0c;也适合Linux期末考试的小伙伴&#xff0c;从头到尾理论与实操相结合&#xff0c;让你快速对Linux进行了解和掌握。 一、Linux概述 为什么要学习Linux操作系统&#xff1f; 完全免费-开源 任何用户均可下载使用 安全…

STM32 高级 谈一下IPV4/默认网关/子网掩码/DNS服务器/MAC

首先可以通过 winr->输入cmd->输入ipconfig 命令可以查看计算机的各种地址 IPV4&#xff1a;是互联网协议第 4 版&#xff08;Internet Protocol version 4&#xff09;所使用的地址。它是一个 32 位的二进制数字&#xff0c;通常被分为 4 个 8 位的部分&#xff…

Python的`turtle`库来模拟满屏烟花效果

以下是使用Python的turtle库来模拟满屏烟花效果的代码示例,运行代码后会在一个图形窗口中呈现出不断绽放的烟花场景,希望你能喜欢哦。 import turtle import random import time# 初始化屏幕 screen = turtle.Screen() screen.bgcolor("black") screen.title(&quo…

USB免驱全协议IC卡读写器 QT程序开发

15693卡片&#xff0c;通常指的是符合ISO/IEC 15693标准的非接触式智能卡或RFID卡。以下是对15693卡片的详细介绍&#xff1a; 一、基本概述 15693卡片是基于ISO/IEC 15693国际标准设计的非接触式智能卡&#xff0c;该标准定义了用于非接触式集成电路卡&#xff08;即RFID卡&…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程&#xff0c;需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢&#xff1f;使用SysTick&#xff0c;那么怎么使用SysTick来模拟多线程呢&#xff1f;前面我们知道SysTick就是一个定时器&#xff0c;它不是在主函数的while循…