useEffect 和 useLayoutEffect 是 React 中的兩個(gè) Hook砚殿,它們都用于處理副作用诬乞,但是在執(zhí)行時(shí)機(jī)和使用場(chǎng)景上有所不同喝峦。以下是它們的主要區(qū)別:
1. 執(zhí)行時(shí)機(jī)
useEffect:
在組件渲染后執(zhí)行氢卡,且在瀏覽器繪制后進(jìn)行久锥。
適合用于處理不影響布局的副作用靡菇,比如數(shù)據(jù)獲取鸽斟、事件監(jiān)聽等挚冤。
useLayoutEffect:
在瀏覽器繪制之前執(zhí)行妈橄。
適合用于需要直接讀取 DOM 布局并同步觸發(fā)重渲染的副作用庶近,比如測(cè)量 DOM 元素的尺寸或位置。
2. 性能影響
useEffect:
不會(huì)阻塞瀏覽器繪制眷蚓,因此對(duì)用戶體驗(yàn)的影響較小鼻种。
useLayoutEffect:
由于會(huì)阻塞瀏覽器繪制,可能導(dǎo)致性能問題沙热,尤其是當(dāng)副作用較重時(shí)叉钥。
3. 使用場(chǎng)景
useEffect:
數(shù)據(jù)獲取
訂閱事件
清理定時(shí)器
useLayoutEffect:
讀取和同步 DOM 布局
動(dòng)畫效果的測(cè)量
需要在瀏覽器繪制前更新狀態(tài)的場(chǎng)景
示例
import React, { useEffect, useLayoutEffect } from 'react';
function Example() {
useEffect(() => {
console.log('useEffect: This runs after rendering.');
}, []);
useLayoutEffect(() => {
console.log('useLayoutEffect: This runs before rendering.');
}, []);
return <div>Hello, World!</div>;
}
總結(jié)
使用 useEffect 處理大多數(shù)副作用。
使用 useLayoutEffect 處理需要同步的篙贸、影響布局的副作用投队。一般情況下,優(yōu)先使用 useEffect爵川,只有在確實(shí)需要時(shí)再使用 useLayoutEffect敷鸦。