Skip to content
字数
690 字
阅读时间
3 分钟

useEffectuseLayoutEffect 是 React 中的两个 Hook,它们用于在函数组件中处理副作用。尽管它们在语法上类似,但在执行时机和适用场景上有所不同。

useEffect

特点:

  • 执行时机:在浏览器完成布局与绘制之后才会执行。通常用于异步操作、数据获取、订阅等不需要同步阻塞渲染的副作用。
  • 性能:由于它在绘制之后执行,不会阻塞浏览器的布局和绘制,因此性能较好,适合绝大多数副作用处理场景。

使用场景:

  • 数据获取(例如,fetch 请求)。
  • 订阅和取消订阅(例如,WebSocket 或事件监听)。
  • 操作 DOM 但不需要立即生效的场景。
javascript
useEffect(() => {
  // 副作用逻辑
  console.log('useEffect');
  return () => {
    // 清理逻辑
  };
}, [dependencies]);

useLayoutEffect

特点:

  • 执行时机:在浏览器完成 DOM 更新后、绘制之前同步执行。用于需要在浏览器绘制前同步执行的副作用,确保副作用会在浏览器绘制前完成。
  • 性能:因为会阻塞浏览器的绘制,所以要谨慎使用,通常用于需要同步操作 DOM 的场景。

使用场景:

  • 需要同步读取布局信息并且立即重新渲染的场景。
  • 操作 DOM 并且需要在下一次重绘之前完成。
javascript
useLayoutEffect(() => {
  // 副作用逻辑
  console.log('useLayoutEffect');
  return () => {
    // 清理逻辑
  };
}, [dependencies]);

异同点对比

相同点:

  • 都是用于在函数组件中处理副作用。
  • 都可以接收一个依赖项数组,以控制副作用的执行时机。
  • 都可以返回一个清理函数,用于在组件卸载或副作用重新执行前进行清理。

不同点:

  • 执行时机useEffect 在组件渲染完毕后执行,而 useLayoutEffect 在组件更新 DOM 后、浏览器绘制前同步执行。
  • 使用场景useEffect 适用于大多数异步副作用操作,useLayoutEffect 适用于需要同步操作 DOM 的场景。
  • 性能useEffect 对性能影响较小,不会阻塞绘制;useLayoutEffect 会阻塞绘制,需谨慎使用。

总结来说,useEffect 是默认推荐的副作用 Hook,适用于大多数场景。只有在需要同步操作 DOM 并确保在浏览器绘制前完成时,才使用 useLayoutEffect

贡献者

The avatar of contributor named as sunchengzhi sunchengzhi

文件历史

撰写

布局切换

调整 VitePress 的布局样式,以适配不同的阅读习惯和屏幕环境。

全部展开
使侧边栏和内容区域占据整个屏幕的全部宽度。
全部展开,但侧边栏宽度可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
全部展开,且侧边栏和内容区域宽度均可调
侧边栏宽度可调,但内容区域宽度不变,调整后的侧边栏将可以占据整个屏幕的最大宽度。
原始宽度
原始的 VitePress 默认布局宽度

页面最大宽度

调整 VitePress 布局中页面的宽度,以适配不同的阅读习惯和屏幕环境。

调整页面最大宽度
一个可调整的滑块,用于选择和自定义页面最大宽度。

内容最大宽度

调整 VitePress 布局中内容区域的宽度,以适配不同的阅读习惯和屏幕环境。

调整内容最大宽度
一个可调整的滑块,用于选择和自定义内容最大宽度。

聚光灯

支持在正文中高亮当前鼠标悬停的行和元素,以优化阅读和专注困难的用户的阅读体验。

ON开启
开启聚光灯。
OFF关闭
关闭聚光灯。

聚光灯样式

调整聚光灯的样式。

置于底部
在当前鼠标悬停的元素下方添加一个纯色背景以突出显示当前鼠标悬停的位置。
置于侧边
在当前鼠标悬停的元素旁边添加一条固定的纯色线以突出显示当前鼠标悬停的位置。