Компоненты — строительные блоки React-приложений
Содержание
- Что такое компонент и зачем он нужен
- Два вида компонентов в React
- Functional Component (современный стандарт)
- Правила именования компонентов
- Class Component (для понимания legacy-кода)
- Сравнение функционального и классового компонентов
- Структура компонента (что внутри)
- Дочерние компоненты (композиция)
- Компоненты-обёртки (children)
- Именованный и дефолтный экспорт
- Что мы узнали
- Задание для закрепления (на 5–7 минут)
- Что дальше?
Цель урока: научиться создавать переиспользуемые React-компоненты двух типов: функциональные (современный способ) и классовые (которые встречаются в старых проектах). Понять, зачем нужны компоненты, как они работают и чем отличаются друг от друга.
Что такое компонент и зачем он нужен
Зачем это нужно?
- Переиспользование: один компонент можно использовать в разных местах
- Изоляция: код компонента не влияет на остальные части приложения
- Поддержка: легко находить и исправлять ошибки
- Читаемость: приложение разбито на понятные куски
Главная мысль:
React-приложение — это дерево компонентов. Один большой компонент собирает внутри себя множество маленьких.
Два вида компонентов в React
| Тип | Синтаксис | Сейчас используют? | Когда нужен |
|---|---|---|---|
| Functional Component | Функция, возвращающая JSX | ✅ Да (основной) | В большинстве случаев |
| Class Component | Класс, наследующий React.Component |
❌ Редко | В старых проектах или для Error Boundaries |
Важно: В современных проектах (с хуками) используют только функциональные компоненты. Классовые — для понимания legacy-кода.
Functional Component (современный стандарт)
Простой компонент:
function Welcome() {
return <h1>Привет, мир!</h1>;
}
Стрелочная функция:
const Welcome = () => {
return <h1>Привет, мир!</h1>;
};
Сокращённый вариант (если одна строка):
const Welcome = () => <h1>Привет, мир!</h1>;
Компонент с параметрами (props):
function Welcome(props) {
return <h1>Привет, {props.name}!</h1>;
}
Использование в другом компоненте:
function App() {
return (
<div>
<Welcome name="Алексей" />
<Welcome name="Мария" />
<Welcome name="Иван" />
</div>
);
}
// На экране:
// Привет, Алексей!
// Привет, Мария!
// Привет, Иван!
Правила именования компонентов
| Правило | Пример | Почему |
|---|---|---|
| Начинай с большой буквы | Welcome, UserProfile |
React отличает компоненты от HTML-тегов |
| Используй PascalCase | MyButton, HeaderMenu |
Стиль для классов и компонентов |
| Название отражает суть | UserCard, ProductList |
Понятно, что делает компонент |
| Не используй аббревиатуры | → UserProfile |
Код должен быть читаемым |
Почему с большой буквы?
<welcome />— React поймёт как HTML-тег<Welcome />— React поймёт как компонент
Оживи свой сайт. Освой JavaScript!
Статичная верстка — это только скелет. Наш онлайн-курс "JavaScript с нуля до профи" даст твоим страницам мышцы и нервы. Научись создавать слайдеры, формы, интерактивные карты и получать данные с сервера.
От теории — к реальным скриптам в твоём портфолио.
Class Component (для понимания legacy-кода)
Базовый классовый компонент:
import React from 'react';
class Welcome extends React.Component {
render() {
return <h1>Привет, мир!</h1>;
}
}
С параметрами (props):
class Welcome extends React.Component {
render() {
return <h1>Привет, {this.props.name}!</h1>;
}
}
С состоянием (state):
class Counter extends React.Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
render() {
return (
<div>
<p>Счёт: {this.state.count}</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
+1
</button>
</div>
);
}
}
Важно! В классовых компонентах:
- Нужно наследовать
React.Component - Обязателен метод
render(), возвращающий JSX propsдоступны черезthis.propsstateдоступен черезthis.state
Сравнение функционального и классового компонентов
| Возможность | Functional Component | Class Component |
|---|---|---|
| Синтаксис | Функция | Класс с render() |
| Доступ к props | props.name |
this.props.name |
| Доступ к state | Через хук useState |
this.state + this.setState() |
| Жизненный цикл | Через хуки (useEffect) |
Методы (componentDidMount и т.д.) |
| Сложность кода | Меньше кода | Больше кода (класс, конструктор) |
| Производительность | Чуть быстрее | Чуть медленее |
| Когда использовать | Всегда в новых проектах | Только в старых/для Error Boundaries |
Структура компонента (что внутри)
Функциональный компонент по частям:
// 1. Импорты
import React from 'react';
// 2. Сам компонент
function UserCard({ name, age, city }) {
// 3. Логика (переменные, функции)
const greeting = `Привет, ${name}!`;
const handleClick = () => {
alert(`Возраст: ${age}`);
};
// 4. Возврат JSX
return (
<div className="card">
<h2>{greeting}</h2>
<p>Город: {city}</p>
<button onClick={handleClick}>Показать возраст</button>
</div>
);
}
// 5. Экспорт
export default UserCard;
Классовый компонент по частям:
// 1. Импорты
import React from 'react';
// 2. Объявление класса
class UserCard extends React.Component {
// 3. Конструктор (если нужно state)
constructor(props) {
super(props);
this.state = { isVisible: true };
}
// 4. Методы компонента
handleClick() {
alert(`Возраст: ${this.props.age}`);
}
// 5. Метод render (обязателен)
render() {
const { name, city } = this.props;
return (
<div className="card">
<h2>Привет, {name}!</h2>
<p>Город: {city}</p>
<button onClick={() => this.handleClick()}>Показать возраст</button>
</div>
);
}
}
// 6. Экспорт
export default UserCard;
Дочерние компоненты (композиция)
Компоненты могут вкладываться друг в друга:
// Дочерний компонент
function Button({ text, onClick }) {
return <button onClick={onClick}>{text}</button>;
}
// Родительский компонент
function App() {
const handleClick = () => alert('Клик!');
return (
<div>
<h1>Моё приложение</h1>
<Button text="Нажми меня" onClick={handleClick} />
<Button text="Ещё кнопка" onClick={handleClick} />
</div>
);
}
Компоненты-обёртки (children)
Можно передавать внутрь компонента другие компоненты через props.children:
function Card({ children }) {
return (
<div className="card">
<h3>Карточка</h3>
{children}
</div>
);
}
function App() {
return (
<Card>
<p>Это содержимое карточки</p>
<button>Кнопка внутри</button>
</Card>
);
}
Именованный и дефолтный экспорт
Дефолтный экспорт (один на файл):
export default function Button() { ... }
// Импорт:
import Button from './Button';
Именованный экспорт (несколько):
export function Button() { ... }
export function Input() { ... }
// Импорт:
import { Button, Input } from './components';
Какой выбрать?
- Для главного компонента в файле —
export default - Для вспомогательных или нескольких компонентов —
export
Что мы узнали
| Что узнали | Как это работает |
|---|---|
| Компоненты — это части интерфейса | Их можно переиспользовать |
| Functional Component | Функция, возвращающая JSX |
| Class Component | Класс с методом render() |
| Именование с большой буквы | <Welcome /> — компонент, <welcome /> — HTML |
| Композиция | Компоненты внутри компонентов |
| children | Вложенное содержимое компонента |
| Экспорт | export default или именованный |
Задание для закрепления (на 5–7 минут)
- Создай новый файл
src/components/Greeting.jsx - Напиши функциональный компонент
Greeting, который принимает пропсnameи выводит<h2>Привет, {name}!</h2> - Создай файл
src/components/UserCard.jsx - Напиши классовый компонент
UserCard, который принимает пропсыname,age,cityи выводит карточку с этими данными - В
App.jsxимпортируй оба компонента и отобрази их на странице
Проверка: На экране должно появиться приветствие и карточка с данными пользователя.
Что дальше?
В следующем уроке разберём Props и State — главные механизмы передачи данных. Ты поймёшь, как данные текут через компоненты, как хранить изменения и как заставить интерфейс реагировать на действия пользователя. Это фундаментальная тема, без которой React-приложения не работают.