Компоненты React похожи на функции, которые возвращают HTML-элементы.
Что такое компоненты в React?
Компоненты — это самостоятельные и многократно используемые куски кода. Они выполняют ту же роль, что и функции JavaScript, но действуют изолированно и возвращают HTML.
Компоненты бывают двух видов: компоненты-классы и компоненты-функции. В этом уроке мы сосредоточимся на компонентах-функциях.
В старых базах кода React вы можете встретить преимущественно компоненты-классы.
Сейчас рекомендуется использовать компоненты-функции совместно с хуками вместо компонентов-классов.
Тем не менее, компоненты-классы по-прежнему поддерживаются, подробнее смотрите в соответствующем разделе.
Создание первого компонента React
При создании компонента React имя компонента обязательно ДОЛЖНО начинаться с заглавной буквы.
Компоненты React возвращают HTML-код.
Пример
Создаем компонент-функцию Car:
function Car() {
  return (
    <h2>Привет, я - автомобиль!</h2>
  );
}
Рендеринг компонента
Теперь наше React-приложение содержит компонент Car, который возвращает элемент <h2>.
Чтобы использовать этот компонент в приложении, ссылаемся на него так: <Car />.
Пример
Отобразим компонент Car в элементе "root":
createRoot(document.getElementById('root')).render(
  <Car />
);
Пропсы (props)
В компонент Rect можно передавать аргументы в виде props (пропсов), что означает - свойства (properties).
Аргументы отправляются в компонент в виде HTML-атрибутов.
Подробнее о пропсах вы узнаете в соответствующей главе.
Пример
Используем атрибут для передачи цвета компоненту Car и применяем его в функции рендера:
function Car(props) {
  return (
    <h2>Я {props.color} - автомобиль!</h2>
  );
}
createRoot(document.getElementById('root')).render(
  <Car color="красный" />
);
Компоненты внутри компонентов
Мы можем обращаться к компонентам изнутри других компонентов.
Пример
Используем компонент Car внутри компонента Garage:
function Car() {
  return (
    <h2>Я - автомобиль!</h2>
  );
}
function Garage() {
  return (
    <>
      <h1>Кто живёт в моём гараже?</h1>
      <Car />
    </>
  );
}
createRoot(document.getElementById('root')).render(
  <Garage />
);
Повторный рендеринг компонента
Один и тот же компонент можно рендерить несколько раз.
Пример
Используем компонент Car дважды внутри компонента Garage:
function Car() {
  return (
    <h2>Я - автомобиль!</h2>
  );
}
function Garage() {
  return (
    <>
      <h1>Кто живёт в моём гараже?</h1>
      <Car />
      <Car />
    </>
  );
}
createRoot(document.getElementById('root')).render(
  <Garage />
);
Предыдущий пример может показаться бессмысленным, но если мы передадим разные аргументы компоненту Car, ситуация изменится.
Пример
Используем компонент Car для отображения двух разных автомобилей:
function Car(props) {
  return (
    <h2>Я {props.brand}!</h2>
  );
}
function Garage() {
  return (
    <>
      <h1>Кто живёт в моём гараже?</h1>
      <Car brand="Ford" />
      <Car brand="BMW" />
    </>
  );
}
createRoot(document.getElementById('root')).render(
  <Garage />
);
Компоненты в файлах
React поощряет повторное использование кода, и бывает полезно разделить компоненты по отдельным файлам.
Для этого создайте новый файл в папке src с расширением .jsx и разместите там код компонента.
Пример
Это новый файл Vehicle.jsx:
// Vehicle.jsx
function Car() {
  return (
    <h2>Привет, я машина!</h2>
  );
}
export default Car;
Чтобы использовать компонент Car, необходимо импортировать файл Vehicle.jsx в ваше приложение.
Пример
Импортируем файл Vehicle.jsx в приложение и используем компонент Car:
// main.jsx
import { createRoot } from 'react-dom/client';
import Car from './Vehicle.jsx';
createRoot(document.getElementById('root')).render(
  <Car />
);