Гид по технологиям

Как работать с props в React: руководство по использованию, проверке и повторному использованию

6 min read React Обновлено 31 Dec 2025
Props в React: руководство по использованию
Props в React: руководство по использованию

Программист за двумя ноутбуками

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

Props могут хранить примитивы, массивы, объекты и функции. В этом материале вы узнаете практические приёмы работы с props: как передавать значения, задавать значения по умолчанию, проверять типы и тестировать поведение компонентов.

Зачем нужны props в React

Коротко: props позволяют передавать данные сверху вниз (от родителя к дочернему). Это канал для коммуникации между компонентами.

Правило, которое важно запомнить: компоненты должны вести себя максимально похоже на чистые функции относительно props — они не должны изменять значения переданных им пропсов. Это сохраняет предсказуемость и упрощает отладку и тестирование.

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

Как использовать props: базовый пример

Чтобы использовать prop, передайте его как атрибут тега компонента и затем прочитайте внутри компонента.

Пример: Header принимает title

function Header(props) {
  return (
    

{props.title}

); } export default Header;

В этом примере компонент Header читает props.title и рендерит его в заголовке.

App.js: передаём значение пропса

import Header from './components/Header';

function App() {
  return (
    
); } export default App;

Когда вы запустите приложение, компонент Header получит значение ‘Task Tracker’ и покажет его в UI.

Вывод React props в браузере

Значения по умолчанию (defaultProps и альтернативы)

Если компонент не получил prop, можно задать значение по умолчанию. Один способ — свойство defaultProps на компоненте.

Пример с defaultProps

function Header(props) {
  return (
    

{props.title}

); } Header.defaultProps = { title: 'The App Name' }; export default Header;

Если App будет рендерить

без атрибута title, в заголовке отобразится ‘The App Name’.

Обновлённый вывод без пропса — пустой заголовок

Вывод с defaultProps — отображается имя приложения

Совет: в функциональных компонентах часто используют параметры по умолчанию через деструктуризацию:

function Header({ title = 'The App Name' }) {
  return (
    

{title}

); }

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

Проверка типов с PropTypes и альтернативы

PropTypes — это библиотека для рантайм-проверки типов пропсов. Она помогает ловить ошибки, когда компонент получает неожидаемый тип.

Пример использования PropTypes

import PropTypes from 'prop-types';

function Header({ title }) {
  return (
    

{title}

); } Header.defaultProps = { title: 'The App Name' }; Header.propTypes = { title: PropTypes.string }; export default Header;

Альтернатива для более строгой проверки — TypeScript. TypeScript выполняет проверку типов на этапе компиляции и даёт более сильную гарантию корректности API компонентов. Если ваш проект на TypeScript, PropTypes часто избыточны.

Повторное использование компонентов через props

Props делают компонент универсальным. Создадим компонент Task и будем рендерить несколько задач, просто меняя проп name.

Повторно используемые компоненты Task в UI

Task.js

import PropTypes from 'prop-types';

function Task({ name }) {
  return (
    

{name}

); } Task.defaultProps = { name: 'Task Name' }; Task.propTypes = { name: PropTypes.string }; export default Task;

App.js: несколько экземпляров

import Header from './components/Header';
import Task from './components/Task';

function App() {
  return (
    
); } export default App;

Так вы создаёте одну повторно используемую компоненту Task и настраиваете её разными props.

Когда props не подходят: ограничения и альтернативы

  • Пробрасывание через много уровней («prop drilling»). Если вам приходится передавать одно и то же значение через несколько промежуточных компонентов, стоит рассмотреть Context API или глобальное хранилище состояния (Redux, Zustand).
  • Сложные зависимости между состояниями. Если дочерние компоненты должны синхронно изменять одно и то же состояние, лучше управлять состоянием в родителе или централизованно.
  • Частая передача функций-колбэков по дереву. Иногда легче поднять состояние выше или использовать мемоизацию (useCallback) и Context.

Альтернативы и когда их применять:

  • Context API — для настроек, темы, локали, текущего пользователя и т.п.; подходит, если данные нужны многим компонентам на разных уровнях.
  • Redux / Zustand / MobX — для сложной логики приложения и согласованного управления состоянием, когда требуется предсказуемый поток данных и время жизни состояния не связано с UI-деревом.
  • Hooks и local state — когда состояние специфично для одного компонента.

Практические приёмы и эвристики

  • Деструктурируйте props в сигнатуре функции: function MyComp({ a, b }) — короче и проще тестировать.
  • Используйте PropTypes или TypeScript для контрактов API компонентов.
  • Не модифицируйте объекты из props напрямую; клонируйте перед изменением.
  • Мемоизируйте callback-функции (useCallback) и вычисления (useMemo) при необходимости, чтобы избежать лишних перерисовок.
  • Разбивайте большие компоненты: если компонент принимает >5 props, подумайте о рефакторинге.

Тесты: проверки props в компонентных тестах

Ниже пример простого теста с React Testing Library, который проверяет рендеринг заголовка на основе пропса.

// Header.test.js
import { render, screen } from '@testing-library/react';
import Header from './Header';

test('Header отображает title из props', () => {
  render(
); expect(screen.getByText('Task Tracker')).toBeInTheDocument(); }); test('Header использует defaultProps если проп не передан', () => { render(
); expect(screen.getByText('The App Name')).toBeInTheDocument(); });

Критерии приёмки:

  • Компонент рендерит текст, соответствующий переданному prop.
  • При отсутствии prop отображается значение по умолчанию.
  • Prop с неправильным типом должен приводить к предупреждению (PropTypes) или ошибке компиляции (TypeScript).

Роль-ориентированные чеклисты

Для разработчика:

  • Деструктурируйте props.
  • Добавьте defaultProps или параметры по умолчанию.
  • Определите propTypes или TypeScript-тип.
  • Избегайте побочных эффектов с props.

Для ревьювера кода:

  • Проверить, не модифицируются ли объекты из props.
  • Убедиться, что компонент не принимает слишком много пропсов.
  • Проверить наличие тестов для ключевых props.

Миграция и совместимость

  • Если проект переводится на TypeScript, начните с добавления типов для публичных компонентов: interface Props { title?: string }.
  • Для функций используйте параметры по умолчанию вместо defaultProps. Для классовых компонентов defaultProps остаётся поддерживаемым.
  • При замене PropTypes на TypeScript можно постепенно убирать PropTypes по мере типизации модулей.

Примеры ошибок и как их устранить

  1. Пустой заголовок после удаления атрибута title — решается defaultProps или параметром по умолчанию.
  2. Непредсказуемое поведение при передаче мутабельных объектов — клонируйте объекты перед изменением или используйте неизменяемые структуры.
  3. Лаги и лишние рендеры — мемоизируйте функции и значения, проверьте ключи в списках.

Глоссарий (в одну строку)

  • props — входные данные компонента, передаются от родителя к дочернему.
  • defaultProps — значения по умолчанию для пропсов компонента.
  • PropTypes — рантайм-проверка типов пропсов.
  • Context API — механизм глобального контекста для передачи данных вниз по дереву без проброса через пропсы.

Краткое резюме

  • Props — основной способ конфигурирования компонентов и передачи данных сверху вниз.
  • Для значений по умолчанию используйте параметры по умолчанию или defaultProps для классов.
  • Для проверки типов выбирайте PropTypes или TypeScript; TypeScript даёт более строгие гарантии на этапе сборки.
  • Если вы сталкиваетесь с «prop drilling», рассмотрите Context API или состояние на уровне приложения.

Важно: всегда проектируйте публичный API компонента (набор props) так, чтобы он был простым, предсказуемым и документированным.

Подсказка: начните с небольших компонентов и растите архитектуру вместе с приложением — props отлично подходят для простых и средних случаев, а Context/Redux — для более сложных.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как безопасно купить б/у MacBook
Руководство

Как безопасно купить б/у MacBook

Планшет Android как дисплей для Raspberry Pi
Raspberry Pi

Планшет Android как дисплей для Raspberry Pi

Focus assist в Windows 11 — включение и настройка
Windows

Focus assist в Windows 11 — включение и настройка

Не приходят уведомления Facebook — исправить на iPhone/Android
Мобильные

Не приходят уведомления Facebook — исправить на iPhone/Android

Как исправить sudo: команда не найдена в Linux
Linux

Как исправить sudo: команда не найдена в Linux

Автоответы на SMS в Android: как настроить
Android.

Автоответы на SMS в Android: как настроить