Что такое компоненты в React
Компоненты — это строительные блоки интерфейсов в React. Вы можете представить их как маленькие кусочки кода, которые можно многократно использовать. По сути, компонент — это JavaScript-функция или класс, которая возвращает JSX. Можно сказать, что компонент — это как LEGO: он может быть маленькой деталью или целой конструкцией.
Пример компонента:
// Компонент "Приветствие"
function Greeting() {
return <h1>Привет, React!</h1>;
}
Этот компонент возвращает заголовок <h1>. Легко, правда? Но есть разные способы создавать компоненты, и именно о них мы поговорим ниже.
Функциональные компоненты
Функциональные компоненты — это, как правило, самый простой способ создания компонентов в React. Их основная задача — принимать пропсы (входные параметры) и возвращать разметку. Если вы знаете, как написать JavaScript-функцию, то знаете, как создать функциональный компонент.
Пример:
type GreetingProps = {
name: string;
};
const Greeting: React.FC<GreetingProps> = ({ name }) => {
return <h1>Привет, {name}!</h1>;
};
Особенности:
Синтаксис: функциональный компонент — это просто функция, которая принимает
propsи возвращает JSX.Простота: лаконичный синтаксис. Не нужно работать с классами, состояниями или
this(ура, никаких головных болей!).Поддержка хуков: это важное преимущество. С помощью таких хуков, как
useStateиuseEffect, функциональные компоненты могут использовать состояния и эффекты, которые раньше были доступны только в классовых компонентах.
Пример с состоянием:
import React, { useState } from 'react';
const Counter: React.FC = () => {
const [count, setCount] = useState(0);
return (
<div>
<p>Текущий счёт: {count}</p>
<button onClick={() => setCount(count + 1)}>Увеличить</button>
</div>
);
};
Обратите внимание, что здесь мы использовали хук useState для управления состоянием компонента. Это делает функциональные компоненты гораздо более мощными, чем они были до появления React-хуков.
Классовые компоненты
Если функциональные компоненты — это "молодёжная тусовка" React, то классовые компоненты — это "старожилы". Они были в центре внимания до появления хуков в React 16.8. Основное отличие классовых компонентов заключается в том, что они используют JavaScript-классы class, обладают состоянием state и методами жизненного цикла.
Пример:
import React, { Component } from 'react';
type CounterState = {
count: number;
};
class Counter extends Component<{}, CounterState> {
state = {
count: 0,
};
increment = () => {
this.setState({ count: this.state.count + 1 });
};
render() {
return (
<div>
<p>Текущий счёт: {this.state.count}</p>
<button onClick={this.increment}>Увеличить</button>
</div>
);
}
}
Особенности:
Использование классов: классовый компонент должен наследовать
React.Component.Методы жизненного цикла: классы предоставляют специальные методы, чтобы работать с жизненным циклом компонента. Например,
componentDidMount()вызывается после первого рендера.Состояние (state): у классовых компонентов есть объект состояния, который изменяется через метод
setState.this: это слово может стать вашим лучшим другом или злейшим врагом, если вы забудете правильно привязать метод.
Сравнение функциональных и классовых компонентов
| Свойство | Функциональные компоненты | Классовые компоненты |
|---|---|---|
| Синтаксис | Простая функция | Использует JavaScript-классы |
| Поддержка хуков | Полная | Нет (для хуков) |
| Использование this | Нет | Да |
| Состояния и эффекты | Управляются через хуки | Управляются через state и методы жизненного цикла |
| Лаконичность | Более лаконичное написание | Более многословное |
| Методы жизненного цикла | Заменяются хуком useEffect | Специальные методы (например, componentDidMount) |
Если бы React был супермаркетом, то хуки были бы самокассами, которые упростили жизнь всем. С появлением хуков функциональные компоненты стали своего рода "новым стандартом", а классовые компоненты постепенно отодвигаются на второй план.
Когда использовать функциональные и классовые компоненты
Функциональные компоненты:
- Используйте их почти всегда. Серьёзно, они проще, чище и поддерживают хуки.
- Идеальны для компонентов любого уровня сложности.
Классовые компоненты:
- Только если вы работаете в старом проекте, где ещё нет хуков.
- Или если вы наткнулись на редкий случай несовместимости (практически нереально в современном React).
Пример: Сравнение в реальном задачном коде
Давайте создадим один компонент двумя способами — с использованием функционального и классового компонентов.
Функциональный компонент:
import React, { useState, useEffect } from 'react';
const Timer: React.FC = () => {
const [seconds, setSeconds] = useState(0);
useEffect(() => {
const interval: number = window.setInterval(() => {
setSeconds((s) => s + 1);
}, 1000);
return () => {
if (interval) clearInterval(interval); // Безопасная очистка таймера
};
}, []);
return <h1>Прошло секунд: {seconds}</h1>;
};
export default Timer;
Классовый компонент:
import React, { Component } from 'react';
type TimerState = {
seconds: number;
};
class Timer extends Component<{}, TimerState> {
state: TimerState = {
seconds: 0,
};
private interval: number | null = null;
componentDidMount() {
this.interval = window.setInterval(() => {
this.setState((prevState) => ({ seconds: prevState.seconds + 1 }));
}, 1000);
}
componentWillUnmount() {
if (this.interval !== null) {
clearInterval(this.interval);
}
}
render() {
return <h1>Прошло секунд: {this.state.seconds}</h1>;
}
}
export default Timer;
Обратите внимание, насколько лаконичнее выглядит функциональный компонент. Вы избавляетесь от громоздкого кода, связанного с методами componentDidMount и componentWillUnmount.
Типичные ошибки
Если вы новичок, пары setState и хуков могут сбить вас с толку. Например, забыть правильно привязать метод в классовом компоненте this.increment = this.increment.bind(this) — довольно частая ошибка. А в функциональных компонентах распространённый баг — это игнорирование зависимостей в хуке useEffect.
Теперь вы знаете, как работать с компонентами в React, когда выбрать функциональные компоненты и когда — классовые. Реальный мир React нынче приветствует функциональные компоненты, так что это ваш новый лучший друг!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ