Skip to main content

Життєвий цикл класового VS функціонального компонента

Головна відмінність

Класові компонентиФункціональні компоненти
Використовують методи життєвого циклу (componentDidMount, componentDidUpdate, componentWillUnmount та ін.)Використовують хуки (useEffect, useLayoutEffect, useMemo тощо)
React сам викликає методи в потрібний моментХуки дають тобі гнучкіший і універсальніший спосіб керувати цими моментами
Логіка "розкидана" по різних методахЛогіка "зібрана" в одному місці і може бути винесена в кастомні хуки

Життєвий цикл класового компонента

Основні стадії та методи:

СтадіяМетодКоли викликаєтьсяАналог у хуках
Монтуванняconstructor()При створенні екземпляра класу-
componentDidMount()Після першого рендеру і вставлення в DOMuseEffect(() => {...}, [])
ОновленняcomponentDidUpdate(prevProps, prevState)Після оновлення state або propsuseEffect(() => {...}, [deps])
РозмонтуванняcomponentWillUnmount()Перед видаленням з DOMuseEffect(() => { return () => {...} }, [])

Приклад (класичний)

javascript
class Timer extends React.Component { state = { seconds: 0 }; componentDidMount() { this.interval = setInterval(() => { this.setState({ seconds: this.state.seconds + 1 }); }, 1000); } componentWillUnmount() { clearInterval(this.interval); } render() { return <p>Минуло секунд: {this.state.seconds}</p>; } }

Життєвий цикл функціонального компонента

У "функціональному світі" немає окремих методів - усе вирішується за допомогою хуків. Основний інструмент - useEffect.

Аналоги стадій:

СтадіяЯк реалізується
МонтуванняuseEffect(() => {...}, [])
ОновленняuseEffect(() => {...}, [deps])
РозмонтуванняuseEffect(() => { return () => {...} }, [])

Приклад (еквівалент через хуки)

javascript
function Timer() { const [seconds, setSeconds] = useState(0); useEffect(() => { const id = setInterval(() => setSeconds(s => s + 1), 1000); return () => clearInterval(id); // cleanup - аналог componentWillUnmount }, []); return <p>Минуло секунд: {seconds}</p>; }

Ключові відмінності в підході

Класовий компонентФункціональний компонент
1Розділений на методи (componentDidMount, componentDidUpdate, …)Усе робиться всередині useEffect із залежностями
2Логіка "розмазана" по різних місцяхЛогіка згрупована за змістом (хуки можна виносити в кастомні)
3Має this і стан через this.state / this.setStateВикористовує useState / useReducer, без this
4setState - завжди асинхронний і об'єднує об'єктиuseState - працює з будь-якими типами даних, включно з об'єктами і функціями
5Один екземпляр класу живе весь часФункція викликається заново при кожному рендері
6Важко перевикористовувати логіку (тільки HOC або render props)Легко ділити й перевикористовувати через кастомні хуки
7Більш "імперативний" стильБільш "декларативний" і функціональний стиль

Ілюстрація

Класовий підхід:

javascript
constructor() render() componentDidMount() componentDidUpdate() componentWillUnmount()

Функціональний підхід:

javascript
Рендер → useEffect(() => {...}, []) Рендер → useEffect(() => {...}, [deps]) Unmountcleanup()

Чому React перейшов до хуків

  • Хуки спрощують код: менше шаблонного коду (this, bind, конструктор).
  • Дозволяють розділяти логіку за змістом, а не за стадіями.
  • Спрощують перевикористання логіки (через кастомні хуки).
  • Краще працюють із TypeScript і функціональним стилем.
  • Підтримують Concurrent Rendering (React 18+).

Підсумок

АспектКласовий компонентФункціональний компонент
API життєвого циклуМетоди (componentDidMount, componentDidUpdate, componentWillUnmount)Хуки (useEffect, useLayoutEffect, cleanup-функції)
Станthis.state + this.setState()useState, useReducer
КонтекстcontextTypeuseContext()
Складність логікиРозкидана по методахСфокусована в хуках
Повторне використанняЧерез HOC/render propsЧерез кастомні хуки
"this"ЄНемає
Продуктивність / зручністьБільш громіздкийБільш декларативний і гнучкий

Головна ідея:

Класові компоненти керують життєвим циклом через окремі методи, а функціональні - через хуки (useEffect), які об'єднують усю життєву логіку в одному місці і дозволяють легко її перевикористовувати.

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

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

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