← [ BACK_TO_NOTES ]

React useLayoutEffect

React 中在浏览器绘制前同步执行的副作用 Hook 及其与 useEffect 的边界。

#frame #react #concept #growing

[!info] related notes

React useLayoutEffect

useLayoutEffect 和 useEffect 一样都属于副作用 Hook,但它执行得更早:在浏览器完成绘制前同步执行。

一句话定义

如果你的副作用必须在用户看到页面前就完成,避免布局闪动或读写错位,才考虑 useLayoutEffect。

最小例子

function Tooltip() {
  const boxRef = useRef<HTMLDivElement | null>(null)
  const [height, setHeight] = useState(0)

  useLayoutEffect(() => {
    const nextHeight = boxRef.current?.getBoundingClientRect().height ?? 0
    setHeight(nextHeight)
  }, [])

  return <div ref={boxRef}>高度: {height}</div>
}

如果你需要在绘制前先读取布局并立刻修正界面,useLayoutEffect 更合适。

最常见的场景

  • 读取元素尺寸
  • 同步修改布局相关 DOM
  • 避免界面先闪一下再修正

为什么不能默认都用它

因为它会阻塞浏览器绘制,成本比 useEffect 更高。大多数普通副作用仍然应该优先用 useEffect。

和 useEffect 的边界

  • useEffect:更适合一般副作用同步
  • useLayoutEffect:更适合必须在绘制前完成的布局相关副作用

什么时候不要滥用

因为它会阻塞浏览器绘制,所以不要把普通请求、订阅、日志、非视觉同步任务都写到这里。

如果不是明确的布局时机问题,优先还是 useEffect。

最短记忆方式

useLayoutEffect 解决的是“不能让用户先看到错误布局”的问题,不是 useEffect 的更高级版本。

学习检查

不看正文回答:

  1. useLayoutEffect 相比 useEffect 最关键的区别是什么?
  2. 为什么它适合 DOM 测量 + 同步位置修正?
  3. 为什么普通数据请求不应该因为“更早”就改用 useLayoutEffect?
  4. 哪些视觉闪动问题是真正的 layout timing 问题,哪些不是?
  5. 如果不需要在绘制前完成同步,应默认回到哪一个 Hook?
创建于 2026/3/19 更新于 2026/9/30
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本