Коротка відповідь
middleФункціональний компонент — це чиста функція, що приймає props і повертає JSX; класовий компонент — це ES6‑клас, що розширює React.Component і має життєвий цикл через методи. Функціональні компоненти підтримують хуки, що дозволяє керувати станом і побічними ефектами без класів. Класові компоненти залишаються корисними лише для старих кодових баз, де потрібна підтримка legacy API.
Повне пояснення
Що це і навіщо
- Функціональні компоненти (FC) – це прості функції, що повертають JSX. Вони легкі, читаються швидко і підтримують хуки (useState, useEffect тощо).
- Класові компоненти – це ES6‑класи, що розширюють
React.Component. Вони мають власний стан (this.state) і життєвий цикл через методиcomponentDidMount,renderтощо.
Ключові принципи/терміни
- Hooks – функції, що дозволяють використовувати state і side‑effects у FC.
- Lifecycle methods –
componentDidMount,shouldComponentUpdateтощо, доступні лише у класах. - Pure function – FC не мають внутрішнього стану (крім хуків) і не зберігають контекст.
Як це працює
- FC:
function Header(props) { return <h1>{props.title}</h1>; }. - Клас:
class Header extends React.Component { render() { return <h1>{this.props.title}</h1>; } }.
Практика і реалізація
- FC з хуком:
const [count, setCount] = useState(0);. - Клас:
this.state = { count: 0 }; this.setState({ count: this.state.count + 1 });.
Тестування
- FC:
render(<Header title="Test" />). - Клас:
mount(<Header title="Test" />)(Enzyme) абоrenderу React Testing Library.
Особливості в контексті React
- FC підтримують
React.memoдля мемоізації. - Класові компоненти не можуть бути обгорнуті
React.memoбезпосередньо.
Оптимізація, типові помилки та edge cases
- Не використовувати
thisу FC. - У класах слід уникати анонімних функцій у
render, щоб не створювати нові інстанси. - При переході з класу на FC варто перевірити, чи не використовується
this.contextбез відповідного контексту.
Диагностика і отладка
- Якщо компонент не оновлюється, перевірте
shouldComponentUpdateу класі абоReact.memoу FC. - Для хуків перевірте, чи правильно вказані залежності у
useEffect.
Альтернативи
- Для старих кодових баз можна залишити класові компоненти, але нові проекти рекомендують FC з хуками.
Крайні випадки і часті помилки
- Використання
this.stateу FC → TypeError. - Забудьте вказати залежності у
useEffect→ нескінченний цикл. - Перевантаження
renderу класі → низька продуктивність. - Не мемоізований колбек у FC → зайві перерендери.
- Відсутність
keyу списку → React‑warning. - Використання класу без розширення
React.Component→ SyntaxError. - Неправильне використання
this.props.childrenу класі → пропущені елементи. - Зміна стану через
this.state =у класі → не оновлюється UI.
Cheatsheet + follow‑up питання
- FC:
function Comp(props) { return <div>{props.text}</div>; }. - Клас:
class Comp extends React.Component { render() { return <div>{this.props.text}</div>; } }. - Follow‑up: Як перевести класовий компонент у функціональний з хуками?