Скидка до 57% и подарки на 135 000 ₽
22 янв 2025
8 минут

Как React-компоненты позволяют повторно использовать код

Веб-разработка
Программирование

Что такое React-компоненты

React-компоненты — это базовые строительные блоки интерфейса, которые позволяют разбивать сложные веб-приложения на независимые, многократно используемые части. Каждая из таких частей отвечает за свою задачу: отображение кнопки, заголовка, формы или карточки товара. Вместо того чтобы писать однотипный код для каждой страницы, вы создаете один компонент и используете его там, где он нужен.

Как это работает?

Например, если вы создаете меню ресторана, компонент карточки блюда будет работать как универсальная инструкция: вы добавляете название блюда, описание и цену, а компонент автоматически собирает красивую карточку и показывает ее на сайте:
function DishCard(props) {
  return (
    <div className="dish-card">
      <h2>{props.name}</h2>
      <p>{props.description}</p>
      <p>Цена: {props.price} ₽</p>
    </div>
  );
}
Теперь вы можете создать меню из десятков блюд с минимальными усилиями:
<DishCard name="Салат Цезарь" description="Свежие листья салата с курицей и сыром" price="450" />
<DishCard name="Тирамису" description="Классический итальянский десерт" price="350" />

Виды React-компонентов

Есть два основных типа: функциональные и классовые. Давайте разберем их на простых примерах.

Функциональные компоненты

Это самые простые и понятные элементы в React — обычные функции, которые принимают данные (их называют props) и возвращают кусок разметки, который React отображает на странице.

Пример: вы хотите приветствовать каждого зарегистрированного посетителя сайта по имени. Вот как это можно сделать:
function Welcome(props) {
  return <h1>Добро пожаловать, {props.name}!</h1>;
}
Теперь вы можете передавать разные имена:
<Welcome name="Анна" />
<Welcome name="Иван" />
Этот код покажет на странице:

  • «Добро пожаловать, Анна!»
  • «Добро пожаловать, Иван!»
Демонстрация передачи props в функциональный компонент Welcome и его рендеринг
Главное преимущество функциональных компонентов — они простые. И отлично подходят для создания маленьких частей интерфейса, например, кнопок или заголовков.

Иногда элемент интерфейса должен меняться в зависимости от действий пользователя. Например, вы хотите создать кнопку, которая считает, сколько раз на нее нажали. Для этого компоненту нужно запоминать, что произошло — это называется состояние.

Раньше такое можно было делать только в классовых компонентах, но потом появились хуки — они помогают обычным компонентам сохранять и обновлять данные. Например, считать, сколько раз нажали на кнопку, или загружать информацию, когда открывается страница.

Пример компонента с хуком useState:
import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // Создаем состояние: count — текущее значение, setCount — функция для его изменения.

  return (
    <div>
      <p>Вы нажали {count} раз(а).</p>
      <button onClick={() => setCount(count + 1)}>Увеличить</button>
    </div>
  );
}
Пример кнопки React с состоянием count, увеличивающим значение при нажатии

Классовые компоненты React

Классовые компоненты — это другой способ создавать React-компоненты. Вместо функции вы пишете класс, который наследуется от базового. Этот вариант раньше использовали для работы с состоянием компонентов React.

В React жизненный цикл компонента включает такие стадии, как монтирование, обновление и размонтирование.
Этапы жизненного цикла React-компонента: монтирование, обновление, размонтирование

Пример создания компонента:
import React from 'react';

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.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-компонент, он сам по себе не отображается на странице. Его нужно отрендерить, то есть «прикрепить» к реальному элементу HTML на странице. Давайте разберем, как это сделать.

Рендеринг — это процесс, когда React переводит ваш компонент в HTML-код, который браузер понимает и отображает. Например, если он возвращает <h1>Добро пожаловать!</h1>, на странице вы увидите заголовок.

Чтобы отрендерить компонент, вам нужно:

  1. Создать компонент.
  2. Найти место в HTML, где вы хотите его отобразить.
  3. Использовать React для рендеринга.

Разберем на практике:

  1. Создайте компонент.
function Welcome() {
  return <h1>Добро пожаловать!</h1>;
}
2. Добавьте HTML-контейнер.

В вашем HTML-файле должен быть контейнер, куда будет помещен компонент. Обычно это div с уникальным идентификатором:
<div id="root"></div>
3. После создания компонента React его нужно отрендерить, чтобы он появился на странице. Это делается с помощью ReactDOM.

В JavaScript-файле подключите библиотеку React и укажите, какой компонент отобразить и где:
import React from 'react';
import ReactDOM from 'react-dom';

function Welcome() {
  return <h1>Добро пожаловать!</h1>;
}

ReactDOM.render(<Welcome />, document.getElementById('root'));
Преобразование React-компонента в HTML с использованием ReactDOM
Современный подход: createRoot

С более новыми версиями React рекомендуется использовать createRoot, который лучше справляется с обновлениями интерфейса.

Пример:
import React from 'react';
import ReactDOM from 'react-dom/client';

function Welcome() {
  return <h1>Добро пожаловать!</h1>;
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Welcome />);

Как создавать композиции из компонентов

Композиция — это метод соединения маленьких компонентов, чтобы создать что-то большее и сложное. Вместо того чтобы писать весь интерфейс в одном большом блоке, вы делите его на небольшие, отдельные части, а потом собираете их вместе.

React дочерние компоненты играют ключевую роль в композиции, позволяя вкладывать одни элементы в другие.

Что такое композиция в React?

Представьте, что вы создаете страницу для ресторана. Она состоит из заголовка, списка блюд и подвала. Вместо того чтобы писать весь код на одной «простыне», вы делите его на отдельные части:

  1. Header — отображает название ресторана.
  2. Menu — содержит список блюд.
  3. Footer — показывает контактную информацию.
Главный компонент App, объединяющий Header, Menu и Footer для построения интерфейса
Например:

  1. Создаем отдельные компоненты.
function Header() {
  return <h1>Ресторан «Весна»</h1>;
}

function Menu() {
  return (
    <ul>
      <li>Пицца «Маргарита»</li>
      <li>Салат «Цезарь»</li>
      <li>Тирамису</li>
    </ul>
  );
}

function Footer() {
  return <footer>Контакты: +7 (999) 999-99-99</footer>;
}
2. Объединяем их в основном компоненте.
function App() {
  return (
    <div>
      <Header />
      <Menu />
      <Footer />
    </div>
  );
}
3. Рендерим.
import React from 'react';
import ReactDOM from 'react-dom/client';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);
На странице будет отображаться:

Ресторан «Весна»
- Пицца «Маргарита»
- Салат «Цезарь»
- Тирамису
Контакты: +7 (999) 999-99-99

Иногда компонент должен отображать не только свои данные, но и «вкладывать» в себя другие элементы. Для этого используются children.

Пример: создадим Card, который будет принимать вложенный контент.

function Card(props) {
  return (
    <div className="card">
      <h2>{props.title}</h2>
      <div>{props.children}</div>
    </div>
  );
}
Используем его:
function App() {
  return (
    <div>
      <Card title="Рекомендуемое блюдо">
        <p>Пицца «4 сыра»</p>
        <p>Цена: 500 ₽</p>
      </Card>
      <Card title="Напитки">
        <ul>
          <li>Кофе</li>
          <li>Чай</li>
          <li>Сок</li>
        </ul>
      </Card>
    </div>
  );
}
Результат:

Рекомендуемое блюдо
Пицца «4 сыра»
Цена: 500 ₽

Напитки
- Кофе
- Чай
- Сок

Композиция позволяет создавать интерфейсы из небольших, легко управляемых частей. Вместо одного огромного файла вы создаете модульные компоненты, которые можно использовать повторно и легко обновлять. Это ключевой принцип React, который делает ваши проекты гибкими и масштабируемыми.

Как извлечь компоненты

Когда компонент становится слишком большим, его сложно читать и изменять. Извлечение — это способ разбить сложный интерфейс на более простые и самостоятельные части. Это делает код проще для чтения, позволяет использовать одни и те же элементы в разных местах и упрощает их обновление и поддержку.

Допустим, у вас есть компонент, который отображает комментарий с аватаром пользователя, текстом и датой. Вот как он может выглядеть до извлечения:
function Comment(props) {
  return (
    <div className="comment">
      <div className="user-info">
        <img src={props.author.avatarUrl} alt={props.author.name} className="avatar" />
        <div className="user-name">{props.author.name}</div>
      </div>
      <div className="comment-text">{props.text}</div>
      <div className="comment-date">{props.date}</div>
    </div>
  );
}
Такой код работает, но может быть сложным для восприятия. В React передача компонента позволяет выносить сложные элементы в отдельные модули и использовать их в других частях приложения, улучшая читаемость и повторное использование кода.

Извлечение компонентов

  1. Создаем компонент Avatar.

Этот компонент отвечает только за отображение аватара пользователя:
function Avatar(props) {
  return <img src={props.avatarUrl} alt={props.name} className="avatar" />;
}
2. Создаем компонент UserInfo.

Он объединяет аватар и имя пользователя:
function UserInfo(props) {
  return (
    <div className="user-info">
      <Avatar avatarUrl={props.user.avatarUrl} name={props.user.name} />
      <div className="user-name">{props.user.name}</div>
    </div>
  );
}
3. Обновляем Comment, чтобы он использовал новые компоненты.

Теперь Comment стал намного проще и понятнее:
function Comment(props) {
  return (
    <div className="comment">
      <UserInfo user={props.author} />
      <div className="comment-text">{props.text}</div>
      <div className="comment-date">{props.date}</div>
    </div>
  );
}
Сравнение большого компонента до и после разделения на Avatar, UserInfo и Comment
Когда извлекать компонент?

Извлекать компонент стоит, если:

  • часть интерфейса повторяется в разных местах;
  • компонент становится слишком большим (правило: более 50 строк — повод задуматься);
  • часть кода выполняет четко определенную задачу (например, отображение аватара).

Извлечение компонентов помогает структурировать код и сделать интерфейсы модульными. Начните с небольших компонентов и постепенно выделяйте их по мере роста проекта.

Зачем нужно повторно использовать код

Повторное использование кода позволяет не только экономить время разработки, но и улучшать управляемость и качество проектов. Вот ключевые причины, почему этот подход так важен:

  • Экономия времени на разработке. Повторно используемые компоненты помогают не писать однотипный код для каждого элемента интерфейса. Вместо этого разработчики используют готовые универсальные решения.
  • Стандартизация дизайна. Единообразный внешний вид и функциональность интерфейса поддерживают целостность пользовательского опыта, независимо от размера команды или масштаба проекта.
  • Снижение сложности кода. С меньшим количеством строк кода команда быстрее находит ошибки и вносит изменения.
  • Простота интеграции новых функций. Это позволяет командам быстрее адаптироваться к требованиям бизнеса или пожеланиям пользователей.

Как повторное использование кода влияет на разработку

Применение повторно используемых компонентов оказывает широкое влияние на весь процесс разработки, начиная с планирования и заканчивая поддержкой.

  • Сокращение расходов на поддержку. Когда изменения вносятся в компонент, эти изменения автоматически применяются ко всем местам, где он используется.
  • Повышение стабильности проекта. Компоненты, используемые в разных частях приложения, тестируются и проверяются более тщательно.
  • Улучшение взаимодействия в команде. Новые участники команды быстрее адаптируются благодаря наличию готовой библиотеки компонентов.

Плюсы и минусы повторного использования кода

Разберем основные плюсы и минусы этого метода с примерами из практики.

  • Плюсы 1. Экономия времени и ресурсовПовторно используемые компоненты позволяют сократить время на разработку, избавляя от необходимости каждый раз писать однотипный код.Пример: представьте крупную сеть магазинов, где на сайте каждого региона используются одинаковые компоненты для отображения каталога, корзины и формы оплаты. Разработка и обновление всех этих элементов происходит централизованно. Если нужно изменить процесс оформления заказа, изменения в одном компоненте автоматически обновят все региональные сайты.2. Единообразие интерфейсаИспользование одних и тех же компонентов гарантирует, что все элементы интерфейса выглядят и работают одинаково, улучшая пользовательский опыт.Пример: вы разрабатываете платформу для банка. Каждый элемент — от кнопок до форм — построен на основе повторно используемых компонентов. Это обеспечивает одинаковый пользовательский опыт на всех страницах: клиент знает, как работает интерфейс, независимо от того, открывает ли он страницу платежей или раздел с информацией о кредитах.3. Простота масштабированияКомпоненты можно легко комбинировать и адаптировать для добавления нового функционала, что ускоряет развитие приложения.Пример: приложение для доставки еды. Вы добавляете новый функционал — отзывы клиентов. Вместо разработки всего с нуля вы используете существующие компоненты, которые уже применяются в разделе с описанием блюд.4. Снижение вероятности ошибокЕдиная база компонентов снижает риск появления багов, так как изменение в одном месте обновляет весь интерфейс.Пример: в системе управления проектами одна и та же форма авторизации используется на мобильном приложении и на веб-сайте. Исправив ошибку в одном компоненте, вы автоматически исправляете ее везде, где он используется.
  • Минусы 1. Сложности с универсальностью компонентовПопытка сделать компоненты слишком универсальными может привести к перегрузке их логики и затруднить поддержку.Пример: у вас есть компонент для отображения товаров в каталоге. Но для раздела «Распродажа» нужно изменить его стиль, а для нового функционала добавления скидок — переписать часть логики. В итоге универсальный компонент становится слишком перегруженным, и его поддержка усложняется.2. Риск зависимости от старого кодаСтарые компоненты могут не соответствовать текущим требованиям, а их модернизация становится сложной из-за устаревшей архитектуры.Пример: приложение для бронирования авиабилетов. Компонент для отображения расписания рейсов написан несколько лет назад и не учитывает новые требования, например, фильтрацию по времени вылета. Внедрить изменения сложно из-за устаревшей архитектуры, и это тормозит развитие проекта.3. Потенциальные проблемы с тестированиемМногофункциональные компоненты, используемые в разных местах, требуют тщательного тестирования.Пример: обновление компонента корзины в интернет-магазине может вызвать сбои в нескольких других разделах, если не протестировать его поведение во всех контекстах.

Заключение

Повторное использование кода с помощью React-компонентов — мощный инструмент, который упрощает разработку и делает приложения более масштабируемыми.

Если вы хотите глубже понять, как использовать React-компоненты, оптимизировать процессы и освоить современные подходы к созданию интерфейсов, рекомендуем присмотреться к курсам от онлайн-школы ProductStar. Переходите на сайт ProductStar, чтобы получить больше информации и начать учиться уже сегодня!
Поделиться
star1

Вам может также понравиться

С гарантией результата: как найти хорошую работу после окончания IT-курсов
Плюсы и минусы онлайн-обучения
Программирование
Язык программирования Ruby: особенности, применение и перспективы
Программирование
Язык программирования Swift: возможности, применение и преимущества
star2

Курсы, которые выбирают чаще всего