ENIGMA AI
ENIGMA AI
React Средний

В чём разница между useEffect и useLayoutEffect?

useEffect vs useLayoutEffect

Timing (Время выполнения):

useEffect:

  • Выполняется асинхронно после рендера
  • Не блокирует отрисовку браузера

useLayoutEffect:

  • Выполняется синхронно после DOM mutations
  • До отрисовки браузера
  • Блокирует визуальное обновление

Порядок выполнения:

1. React renders
2. DOM updated
3. useLayoutEffect runs ← синхронно
4. Browser paints screen
5. useEffect runs ← асинхронно

Когда использовать useLayoutEffect:

// 1. Измерение DOM элементов
function Tooltip({ text, targetRef }) {
    const [position, setPosition] = useState({ x: 0, y: 0 });

    useLayoutEffect(() => {
        const rect = targetRef.current.getBoundingClientRect();
        setPosition({ x: rect.left, y: rect.top - 30 });
    }, [targetRef]);

    return <div style={{ left: position.x, top: position.y }}>{text}</div>;
}

// 2. Предотвращение мерцания
function AnimatedComponent() {
    const ref = useRef();

    useLayoutEffect(() => {
        // Устанавливаем начальные стили ДО отрисовки
        ref.current.style.opacity = 0;
        // Анимация...
    }, []);
}

// 3. Синхронизация с DOM
useLayoutEffect(() => {
    // Скролл к элементу без мерцания
    element.scrollIntoView();
}, [element]);

Когда использовать useEffect:

// 1. Fetch данных
useEffect(() => {
    fetchData().then(setData);
}, []);

// 2. Подписки
useEffect(() => {
    const subscription = eventSource.subscribe(handler);
    return () => subscription.unsubscribe();
}, []);

// 3. Логирование, аналитика
useEffect(() => {
    analytics.pageView(pathname);
}, [pathname]);

Сравнение:

Аспект useEffect useLayoutEffect
Timing После paint До paint
Блокирует UI Нет Да
Использование 95% случаев DOM измерения
SSR Работает Warning

Правило:

Начинайте с useEffect. Используйте useLayoutEffect только если видите мерцание или нужны синхронные DOM измерения.

Похожие вопросы

Готовитесь к собеседованию?

ENIGMA AI — невидимый ИИ-помощник для технических интервью

Попробовать бесплатно
Все вопросы