Коротка відповідь
juniorReact‑компонент має життєвий цикл, що включає «mounting» (constructor → componentDidMount), «updating» (componentDidUpdate) і «unmounting» (componentWillUnmount). У функціональних компонентах ці фази реалізуються через useEffect, useLayoutEffect та cleanup‑функції. Кожен хук приймає залежності, що визначають коли викликатися.
Повне пояснення
Що це і навіщо
React‑компонент – це функція або клас, що рендерить UI. Життєвий цикл визначає, коли компонент створюється, оновлюється і видаляється, що критично для управління ресурсами, підписками та побічними ефектами.
Ключові принципи/терміни
- Mounting – створення і вставка у DOM.
- Updating – реакція на зміни пропсів/стану.
- Unmounting – видалення з DOM і очищення ресурсів.
Як це працює (класові компоненти)
| Фаза | Метод |
|---|---|
| Mounting | constructor → componentDidMount |
| Updating | shouldComponentUpdate → render → componentDidUpdate |
| Unmounting | componentWillUnmount |
Як це працює (функціональні компоненти)
- useEffect – виконується після рендеру; залежності визначають, коли повторювати.
- useLayoutEffect – синхронний після DOM‑модифікацій.
- Cleanup – функція, що повертається useEffect, виконується перед наступним викликом або при unmount.
Практика і реалізація
function Counter() {
const [count, setCount] = useState(0);
// Mounting & Updating
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
// Unmounting
useEffect(() => {
return () => console.log('Component unmounted');
}, []);
return <button onClick={() => setCount(c => c + 1)}>Increment</button>;
}
Тестування
- Jest + React Testing Library: мокати
useEffectчерезjest.spyOn(React, 'useEffect'). - Vitest: використовувати
vi.fn()для перевірки cleanup‑функцій.
Оптимізація
- Використовувати
React.memoдля запобігання зайвим оновленням. - Залежності у
useEffectповинні бути точними, щоб уникнути нескінченних циклів.
Часті помилки
- Забути повернути cleanup‑функцію → ресурси не очищуються.
- Неправильні залежності → ефект виконується занадто часто або не виконується.
- Виклик
setStateу конструкторі класу → викликає помилку. - Використання
componentWillMount/componentWillReceiveProps→ deprecated. - Неочікувані побічні ефекти у
useLayoutEffect→ блокують UI. - Зміна стану в
componentDidUpdateбез перевірки умов → нескінченний цикл. - Неочікуваний рендер через
shouldComponentUpdate→ пропущені оновлення. - Відсутність cleanup‑у у
useEffect→ memory leaks при підписках.
Cheatsheet
- Mounting: constructor → render → componentDidMount / useEffect(() => {}, [])
- Updating: shouldComponentUpdate → render → componentDidUpdate / useEffect(() => {}, [deps])
- Unmounting: componentWillUnmount / cleanup function