useEffect
和 useLayoutEffect
都是 React 的 Hook,用于在函数组件中执行副作用。它们的主要区别在于执行时机。
useEffect
-
执行时机 :
useEffect
在浏览器完成渲染之后异步执行。它不会阻塞浏览器的绘制。 -
适用场景:适用于不需要阻塞浏览器绘制的操作,例如数据获取、订阅、设置定时器等。
javascript复制代码import React, { useEffect } from 'react';
function MyComponent() {
useEffect(() => {
console.log('useEffect');
// 这里可以执行数据获取、订阅等操作
return () => {
console.log('Cleanup useEffect');
// 清理操作
};
}, []); // 空数组表示只在组件挂载和卸载时执行
return <div>My Component</div>;
}
-
优点:不会阻塞浏览器的绘制,用户体验更好。
-
缺点:对于需要在浏览器绘制之前执行的操作(例如 DOM 操作)不适用。
useLayoutEffect
-
执行时机 :
useLayoutEffect
在浏览器完成渲染之前同步执行。它会在所有 DOM 变更之后、绘制之前执行。 -
适用场景:适用于需要在 DOM 更新之后但在浏览器绘制之前执行的操作,例如测量 DOM 元素尺寸或进行 DOM 操作。
javascript复制代码import React, { useLayoutEffect } from 'react';
function MyComponent() {
useLayoutEffect(() => {
console.log('useLayoutEffect');
// 这里可以执行 DOM 操作,例如测量元素尺寸
return () => {
console.log('Cleanup useLayoutEffect');
// 清理操作
};
}, []); // 空数组表示只在组件挂载和卸载时执行
return <div>My Component</div>;
}
-
优点:可以确保在浏览器绘制之前完成对 DOM 的所有更改。
-
缺点:可能会阻塞浏览器的绘制,导致页面渲染延迟。
选择 useEffect
还是 useLayoutEffect
-
一般情况下 :使用
useEffect
,因为它不会阻塞浏览器绘制。 -
需要在 DOM 更新之后立即操作 DOM :使用
useLayoutEffect
,确保在浏览器绘制之前完成 DOM 操作。
总结
-
useEffect
:在渲染之后异步执行,不阻塞浏览器绘制。适用于大多数副作用操作。 -
useLayoutEffect
:在渲染之后同步执行,阻塞浏览器绘制。适用于需要立即操作 DOM 的场景。