Спросят с вероятностью 7%
useEffect и useLayoutEffect — это хуки, которые позволяют выполнять побочные эффекты в функциональных компонентах. Оба они предназначены для выполнения кода после рендеринга компонента, но их поведение различается по времени выполнения и влиянию на рендеринг.
useEffect
✅Когда выполняется:
Выполняется после того, как браузер закончил обновлять DOM. Это означает, что все изменения в DOM уже произошли, и браузер уже отрисовал интерфейс.
✅Основное использование:
Используется для выполнения побочных эффектов, которые не блокируют отрисовку, таких как сетевые запросы, подписки на события, манипуляции с DOM (не критичные к рендерингу) и регистрация таймеров.
✅Поведение:
Не блокирует рендеринг. Это означает, что пользователь может видеть обновленный интерфейс перед выполнением побочного эффекта.
Пример:
import React, { useEffect, useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
console.log('useEffect: Выполняется после рендеринга');
document.title = `Вы нажали ${count} раз`;
return () => {
console.log('useEffect: Очистка');
};
}, [count]);
return (
<div>
<p>Вы нажали {count} раз</p>
<button onClick={() => setCount(count + 1)}>Нажми меня</button>
</div>
);
}
export default Example;useLayoutEffect
✅Когда выполняется:
Выполняется синхронно после всех мутировавших эффектов DOM, но перед тем, как браузер обновит экран. Это означает, что изменения, сделанные в
useLayoutEffect, будут видны пользователю до того, как браузер нарисует обновленный интерфейс.✅Основное использование:
Используется для выполнения побочных эффектов, которые должны произойти до отрисовки интерфейса, таких как измерение размеров DOM-элементов, выполнение синхронных изменений в DOM, которые должны произойти перед отрисовкой, или выполнение операций, которые блокируют отрисовку.
✅Поведение:
Блокирует отрисовку до тех пор, пока эффект не будет выполнен. Это может привести к задержке в отображении интерфейса, если эффект выполняется долго.
Пример:
import React, { useLayoutEffect, useState } from 'react';
function Example() {
const [count, setCount] = useState(0);
useLayoutEffect(() => {
console.log('useLayoutEffect: Выполняется после рендеринга, но перед отрисовкой');
document.title =раз</p>
<button onCl
return () => {
console.log('useLayoutEffect: Очистка');
};
}, [count]);
return (
<div>
<p>Вы нажали {count} раз</p>
<button onClick={() => setCount(count + 1)}>Нажми меня</button>
</div>
);
}
export default Example;Основные различия
1️⃣Время выполнения:
✅
useEffect выполняется асинхронно после того, как браузер обновил экран.✅
useLayoutEffect выполняется синхронно перед тем, как браузер обновит экран.2️⃣Использование:
✅
useEffect лучше подходит для побочных эффектов, которые не влияют на компоновку и отрисовку интерфейса.✅
useLayoutEffect лучше подходит для побочных эффектов, которые должны быть выполнены перед отрисовкой, таких как измерение или изменения в DOM.🔥 ТОП ВОПРОСОВ С СОБЕСОВ
🔒 База собесов | 🔒 База тестовых