Як працює useLayoutEffect у React і чим він відрізняється від useEffect?
useLayoutEffect — це хук у React, схожий на useEffect, але з однією ключовою відмінністю: він виконується відразу після змін у DOM, але перед тим, як браузер застосує зміни та відобразить їх на екрані.
Як працює useLayoutEffect?
- Синхронний ефект. На відміну від
useEffect, який виконується асинхронно після рендерингу,useLayoutEffectвиконується синхронно відразу після оновлення DOM React, але перед тим, як браузер відобразить зміни на екрані. Це може бути корисно, якщо вам потрібно виміряти DOM або виконати дії, які можуть вплинути на рендеринг. - Для роботи з DOM. Цей хук частіше використовується, коли потрібно щось зробити з DOM безпосередньо (наприклад, виміряти розміри елементів або застосувати стилі перед тим, як браузер відобразить оновлення).
Приклад використання useLayoutEffect
import { useState, useLayoutEffect, useRef } from "react";
function LayoutEffectExample() {
const [width, setWidth] = useState(0);
const divRef = useRef(null);
useLayoutEffect(() => {
// Синхронно вимірюємо ширину елемента перед рендерингом
if (divRef.current) {
setWidth(divRef.current.getBoundingClientRect().width);
}
}, []); // Ефект спрацює лише один раз
return (
<div>
<div ref={divRef} style={{ width: "100%" }}>
<p>Ширина елемента: {width}px</p>
</div>
</div>
);
}Відмінності від useEffect
-
Час виконання:
-
useEffectвиконується асинхронно після того, як браузер завершить рендеринг і відобразить зміни. -
useLayoutEffectвиконується синхронно відразу після змін у DOM, але перед тим, як браузер застосує зміни та відобразить їх. -
Використання:
-
useEffectпідходить для більшості побічних ефектів, таких як отримання даних або підписки. -
useLayoutEffectвикористовується, коли потрібно синхронно працювати з DOM, наприклад, для вимірювань або змін, які повинні відбутися перед малюванням. -
Продуктивність:
-
useEffectне блокує рендеринг, оскільки виконується після того, як браузер відобразить зміни. -
useLayoutEffectможе блокувати рендеринг, якщо виконує складні обчислення або операції, які потребують часу.
Важливо про useLayoutEffect:
useLayoutEffect може блокувати рендеринг, тому його слід використовувати лише тоді, коли це дійсно необхідно (наприклад, для вимірювань або синхронних змін у DOM).
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.