React 中useLayoutEffect 和 useEffect 区别和使用场景

 更新时间:2026年05月29日 09:38:13   作者:光影少年  
本文主要介绍了React 中useLayoutEffect 和 useEffect 区别和使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

useEffect 和 useLayoutEffect 都是 React 的副作用 Hook,但它们最大的区别是:

执行时机不同。

一句话理解

  • useEffect
    👉 页面渲染完成后异步执行(不阻塞页面绘制)

  • useLayoutEffect
    👉 DOM 更新后、浏览器绘制前同步执行(会阻塞页面绘制)

React 渲染流程理解

React 更新页面大致流程:

1. React render
2. 更新 DOM
3. useLayoutEffect 执行
4. 浏览器绘制页面(paint)
5. useEffect 执行

所以:

useLayoutEffect 更早
useEffect 更晚

图解理解

useEffect

useEffect(() => {
  console.log('effect')
}, [])

流程:

DOM更新

页面先显示

effect执行

用户会先看到页面。

useLayoutEffect

useLayoutEffect(() => {
  console.log('layout effect')
}, [])

流程:

DOM更新

layout effect执行

页面显示

effect 执行完页面才显示。

核心区别(面试重点)

对比useEffectuseLayoutEffect
执行时机浏览器绘制后浏览器绘制前
是否阻塞渲染不阻塞阻塞
执行方式异步同步
是否可能造成卡顿不容易容易
推荐程度默认优先使用特殊场景再用

使用场景

一、useEffect(99%场景)

这是最常用的。

适合:

  • 请求接口
  • 订阅事件
  • 定时器
  • localStorage
  • 数据获取
  • websocket
  • 日志埋点

示例:

useEffect(() => {
  fetchUser()
}, [])

或者:

useEffect(() => {
  const timer = setInterval(() => {
    console.log('timer')
  }, 1000)
  return () => clearInterval(timer)
}, [])

二、useLayoutEffect(操作 DOM)

只有当你:

“必须在页面绘制前修改 DOM”

才用它。

典型场景:

1. 获取 DOM 尺寸

因为此时 DOM 已更新。

useLayoutEffect(() => {
  const width = divRef.current.offsetWidth
  console.log(width)
}, [])

2. 防止页面闪烁(非常经典)

例如:

useEffect(() => {
  div.style.left = '100px'
}, [])

会发生:

先显示原位置
再瞬移

用户能看到闪动。

而:

useLayoutEffect(() => {
  div.style.left = '100px'
}, [])

浏览器绘制前就改好了。

用户看不到闪动。

3. 动画初始化

例如:

  • GSAP
  • Framer Motion
  • 拖拽库
  • 虚拟列表

很多库内部都用 useLayoutEffect

4. 同步测量 + 修改 DOM

经典:

useLayoutEffect(() => {
  const height = ref.current.offsetHeight
  ref.current.style.height = height + 100 + 'px'
}, [])

因为:

测量DOM
+
修改DOM

必须同步完成。

为什么不要乱用 useLayoutEffect

因为它会:阻塞浏览器绘制

如果里面:

  • 请求接口
  • 大计算
  • 循环
  • await

都会导致:

白屏
卡顿
掉帧

所以 React 官方建议:

优先使用 useEffect。

只有“必须同步操作 DOM”才使用 useLayoutEffect

一个经典面试题

useLayoutEffect 会不会阻塞页面渲染?

会。

因为:它在浏览器 paint 前同步执行

所以会阻塞绘制。

useEffect 会不会?

不会。

因为:页面已经绘制完了

它是异步调度。

React18 注意点

在 React18 严格模式下:<React.StrictMode>

开发环境会:执行两次 effect

包括:

  • useEffect
  • useLayoutEffect

这是为了检查副作用是否安全。

生产环境不会。

服务端渲染 SSR 注意

useLayoutEffect 在 SSR 中会警告:

useLayoutEffect does nothing on the server 

因为:服务端没有 DOM

很多库会写:

const useIsomorphicLayoutEffect =
  typeof window !== 'undefined'
    ? useLayoutEffect
    : useEffect

避免 SSR 报警告。

最佳实践(非常重要)

默认:useEffect

只有:需要同步操作DOM

才使用:useLayoutEffect

面试总结版(背诵)

useEffect 和 useLayoutEffect 都用于处理副作用。

区别是:

  • useEffect 在页面绘制后异步执行,不阻塞渲染,适合请求接口、订阅事件等普通副作用。
  • useLayoutEffect 在 DOM 更新后、浏览器绘制前同步执行,会阻塞页面渲染,适合 DOM 测量、同步修改 DOM、防止闪烁等场景。

开发中应优先使用 useEffect,只有需要同步操作 DOM 时才使用 useLayoutEffect。

到此这篇关于React 中useLayoutEffect 和 useEffect 区别和使用场景的文章就介绍到这了,更多相关React  useLayoutEffect 和 useEffect 区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React项目中应用TypeScript的实现

    React项目中应用TypeScript的实现

    TypeScript通常都会依赖于框架,例如和vue、react 这些框架结合,本文就主要介绍了React项目中应用TypeScript的实现,分享给大家,具体如下:
    2021-09-09
  • React函数式组件Hook中的useEffect函数的详细解析

    React函数式组件Hook中的useEffect函数的详细解析

    useEffect是react v16.8新引入的特性。我们可以把useEffect hook看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三个函数的组合
    2022-10-10
  • 使用React组件编写温度显示器

    使用React组件编写温度显示器

    这篇文章主要为大家详细介绍了使用React组件编写温度显示器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • react.js CMS 删除功能的实现方法

    react.js CMS 删除功能的实现方法

    下面小编就为大家带来一篇react.js CMS 删除功能的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-04-04
  • 基于useImperativeHandle的使用解析

    基于useImperativeHandle的使用解析

    这篇文章主要介绍了基于useImperativeHandle的使用解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • useState 解决文本框无法输入的问题详解

    useState 解决文本框无法输入的问题详解

    这篇文章主要为大家介绍了useState 解决文本框无法输入的问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • react中Hooks的理解和用法小结

    react中Hooks的理解和用法小结

    Hook是 React 16.8 的新增特性,它可以让你在不编写class的情况下使用state以及其他的React特性,这篇文章主要介绍了react中Hooks的理解和用法,需要的朋友可以参考下
    2023-05-05
  • react使用节流函数防止重复点击问题

    react使用节流函数防止重复点击问题

    这篇文章主要介绍了react使用节流函数防止重复点击问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 用React Native制作一个简单的游戏引擎

    用React Native制作一个简单的游戏引擎

    今天给大家分享的是使用React Native制作一个简单的游戏,这个游戏可以跨平台操作,本文通过实例图文相结合给大家介绍的非常详细,对React Native游戏相关知识感兴趣的朋友一起看看吧
    2021-05-05
  • 一文详解React渲染优化之useImmer

    一文详解React渲染优化之useImmer

    在React日常开发中,我们常常被重复渲染或无意义渲染所折磨,穷尽脑汁,做各种优化:memo、useMemo、useCallback、immutable等,本文主要讲述immutable的简约版Immer,感兴趣的同学可以一起来学习
    2023-05-05

最新评论