Skip to main content

Що робить useLayoutEffect?

Що робить useLayoutEffect()

Хук useLayoutEffect() дозволяє виконувати побічні ефекти одразу після того, як React змінив DOM, але до того, як браузер "показав" ці зміни користувачу.

Простіше кажучи: useLayoutEffect виконується між фазою "рендер" і фазою "відмальовування". Це дає тобі шанс "зловити DOM" і зробити з ним щось до того, як користувач побачить результат.


Синтаксис

javascript
useLayoutEffect(() => { // код, який працює з DOM return () => { // очищення (cleanup) }; }, [dependencies]);

Різниця між useEffect і useLayoutEffect

ВластивістьuseEffectuseLayoutEffect
Коли виконуєтьсяПісля відмальовування браузеромДо відмальовування
Чи блокує рендерНіТак (виконується синхронно)
Чи можна читати/вимірювати DOMТак, але вже після показу користувачуТак, до показу (точніші вимірювання)
Типові задачіЗапити, підписки, логіка, що не впливає на розміткуВимірювання і синхронізація DOM, позиціонування, анімації
Частота використанняДуже частоРідко (лише за потреби)

Приклад: вимірювання DOM-елемента

javascript
import { useLayoutEffect, useRef, useState } from "react"; function Box() { const boxRef = useRef(null); const [width, setWidth] = useState(0); useLayoutEffect(() => { // Виконується до відмальовування браузера const rect = boxRef.current.getBoundingClientRect(); setWidth(rect.width); }, []); return ( <div ref={boxRef} style={{ width: "50%" }}> Ширина блоку: {width}px </div> ); }

Тут:

  • useLayoutEffect виконується до того, як браузер покаже сторінку.
  • Ми вимірюємо ширину блоку, поки DOM уже готовий, але ще не відображений.
  • Це запобігає "миготінню" (flashing), якби ширина обчислювалася в useEffect.

Приклад: синхронізація скролу або позиціонування

javascript
function ScrollSync({ scrollTo }) { const ref = useRef(null); useLayoutEffect(() => { ref.current.scrollTop = scrollTo; // точно до відмальовування }, [scrollTo]); return ( <div ref={ref} style={{ height: 200, overflowY: "scroll", border: "1px solid gray" }} > <div style={{ height: 1000 }}>Контент...</div> </div> ); }

Якби ми використовували useEffect, користувач міг би побачити "стрибок" скролу. З useLayoutEffect усе відбудеться до показу, без артефактів.


Важливо пам'ятати

ПравилоПояснення
Виконується синхронно після змін у DOMБлокує відмальовування до завершення коду
Використовуй лише коли потрібно працювати з DOM напрямуНаприклад, вимірювання розмірів, позиціонування
Не використовуй для мережевих запитів або асинхронних дійЦе гальмує відмальовування сторінки
Можна мати і useEffect, і useLayoutEffect в одному компонентіReact сам вирішує порядок (layout → paint → effect)

Підсумкове порівняння

ХукКоли викликаєтьсяДля чого
useEffectПісля того як браузер показав зміниПобічні ефекти, що не впливають на DOM
useLayoutEffectДо того як браузер показав зміниРобота з DOM, вимірювання, синхронізація перед відмальовуванням

Підсумок

ПитанняВідповідь
Що робить useLayoutEffect()Виконує код одразу після оновлення DOM, але до того, як браузер відмалює зміни
Коли використовуватиКоли потрібно виміряти або змінити DOM перед показом користувачу
Чому обережноВін блокує відмальовування і може погіршити продуктивність, якщо використовувати без потреби
ПрикладиВимірювання розмірів, скрол, анімації, запобігання миготінню контенту

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.