useeffect和uselayouteffect

在 React 中,useEffectuseLayoutEffect 的核心区别在于 它们在浏览器渲染流程中的触发时机

简单来说:useEffect异步 执行的,不会阻塞屏幕绘制;而 useLayoutEffect同步执行的,会在屏幕绘制之前完成。


1. 执行时机对比

  • useEffect (最常用)
  1. 状态更新,组件重新渲染。
  2. 浏览器将组件的变更绘制到屏幕上。
  3. 绘制完成后useEffect 的回调函数异步执行。
  • 优点: 不会阻塞用户界面,性能更好。

  • useLayoutEffect (特殊用途)

  1. 状态更新,组件重新渲染。
  2. React 计算出 DOM 的变化。
  3. 在浏览器绘制屏幕之前useLayoutEffect 同步执行。
  4. 浏览器将最终结果绘制到屏幕。
  • 优点: 可以防止用户看到视觉上的"闪烁"或抖动。

2. 核心区别摘要

特性 useEffect useLayoutEffect
执行时机 屏幕绘制 (After paint) 屏幕绘制 (Before paint)
执行方式 异步 (Asynchronous) 同步 (Synchronous)
性能影响 低,不阻塞渲染 高,可能会阻塞页面显示
典型场景 数据获取、订阅、日志记录 读取布局、测量 DOM、手动修改 DOM

3. 什么时候用 useLayoutEffect?

你几乎应该总是首选 useEffect。只有当你遇到以下情况时才考虑 useLayoutEffect

场景:避免界面闪烁

假设你需要根据一个按钮的位置来定位一个弹窗。

  • 如果用 useEffect:浏览器先画出位置不对的弹窗,然后 useEffect 运行并修正位置,用户会看到弹窗"跳"了一下。
  • 如果用 useLayoutEffect:React 会在浏览器画出弹窗前就把位置算好,用户直接看到位置正确的弹窗。

4. 代码演示

javascript 复制代码
import React, { useState, useLayoutEffect, useEffect, useRef } from 'react';

function ComparisonExample() {
  const [value, setValue] = useState(0);
  const divRef = useRef();

  useLayoutEffect(() => {
    // 这里的代码会在屏幕更新前执行
    if (value === 0) {
      // 假设我们要强制把 0 变成一个随机大数
      setValue(10 + Math.random() * 200);
    }
  }, [value]);

  return (
    <div ref={divRef} onClick={() => setValue(0)}>
      Value is: {value} (点击我重置为0)
    </div>
  );
}

注意: 在服务器端渲染 (SSR) 时,useLayoutEffect 会引发警告,因为它要求同步访问浏览器 API。这种情况下通常建议使用 useEffect 或进行环境判断。


你想针对某个具体的业务场景(比如动画或复杂的 DOM 测量)看看该如何选择这两个 Hook 吗?

相关推荐
一天 24h几秒前
从单体到分布式:JWT 如何彻底改变 Web 认证系统
前端·分布式
持梦远方几秒前
Nginx 静态资源挂载与前端部署实战笔记
linux·前端·笔记·nginx
木斯佳2 分钟前
前端八股文面经大全:腾讯云智前端一面(2026-05-13)·面经深度解析
前端·状态模式
fanzhonghong2 分钟前
javaWeb后端开发之Linux项目部署3和Docker部署1
linux·服务器·前端·docker
拉里呱唧4 分钟前
在线可视化HTML编辑器横评:8款拖拽式工具的实测对比
前端·编辑器·html
贵州晓智信息科技4 分钟前
曼德勃罗集的 Three.js 实现
开发语言·javascript·ecmascript
lihaozecq6 分钟前
Agent 开发 Todo 机制设计,让 Agent 拥有规划能力
前端·agent·ai编程
lchcy15 分钟前
移动端h5好多兼容性问题啊
前端
KaMeidebaby21 分钟前
卡梅德生物技术快报|多肽库筛选:基于全质粒 PCR 的噬菌体文库构建与小分子表位淘选实战
前端·数据库·其他·百度·新浪微博
m0_5027249524 分钟前
vue3生成pdf
前端·javascript·vue.js·pdf