Menu

Пропсы в React: передача данных в компоненты с примерами

Пропсы это входные данные компонента React: значения, которые родитель передаёт дочернему компоненту как атрибуты JSX. Как передавать и деструктурировать пропсы, задавать значения по умолчанию, передавать функции, использовать spread и почему пропсы доступны только для чтения.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Пропсы это входные данные компонента React. Родитель передаёт их как атрибуты в JSX, <UserCard name="Ada" online={true} />, а дочерний компонент получает их одним объектом, который обычно деструктурируют прямо в параметрах функции. Пропсы позволяют одному компоненту показывать разные данные при каждом использовании.

Один и тот же UserCard рендерит трёх разных людей. Обратите внимание на последнего: атрибут без значения, online, означает online={true}. Добавьте четвёртую карточку со своим именем и ролью.

Передача и чтение пропсов

Строку передавайте в кавычках, а любое другое значение в фигурных скобках: числа, булевы значения, массивы, объекты, функции и даже JSX.

<Product
    title="Desk lamp"
    price={39.5}
    inStock={false}
    tags={['light', 'office']}
    seller={{ name: 'Lumen', rating: 4.8 }}
/>

React собирает все атрибуты в один объект и передаёт его первым аргументом компонента. Можно читать его как props или распаковать нужные поля прямо в списке параметров:

function Product(props) {
    return <h3>{props.title}</h3>;
}

function Product({ title, price, seller }) {
    return <h3>{title}, ${price} from {seller.name}</h3>;
}

Обе версии получают один и тот же объект. Деструктуризация это распространённый стиль, потому что тогда сигнатура функции точно перечисляет, какие пропсы использует компонент.

Значения по умолчанию

Задайте пропсу значение по умолчанию через значение по умолчанию при деструктуризации в JavaScript, = value. Оно применяется, когда родитель не передал пропс или передал undefined. К null, 0, false или '' оно не применяется, это настоящие значения.

Первые три кнопки берут значения по умолчанию там, где пропс отсутствует или равен undefined. Последняя передаёт null, поэтому size действительно равен null, и поиск не находит отступа. Замените size={null} на size="small", чтобы исправить.

Старый код задаёт значения по умолчанию статическим свойством, Button.defaultProps = { size: 'medium' }. React 19 убрал defaultProps для функциональных компонентов: JSX игнорирует его у функции без всякого предупреждения. В классовых компонентах он всё ещё работает. Используйте значения по умолчанию при деструктуризации.

Передача функций как пропсов

Данные текут вниз: родитель передаёт пропсы детям, а не наоборот. Когда дочернему компоненту нужно сообщить родителю, что что-то произошло, родитель передаёт функцию, а дочерний её вызывает. По соглашению такие пропсы называют onSomething.

Rating ничего не хранит. Он показывает полученное value и сообщает о кликах через onRate. Состояние живёт в App, который передаёт его обратно вниз. Передайте onRate={setRating} напрямую вместо handleRate, и всё продолжит работать: сеттер тоже функция. Такой перенос состояния в общего родителя называется подъёмом состояния.

Spread пропсов

Когда у вас уже есть объект, ключи которого совпадают с пропсами компонента, разверните его через {...object} вместо того, чтобы писать каждый атрибут. Синтаксис rest в списке параметров делает обратное: берёт несколько пропсов по имени, собирает всё остальное и передаёт дальше.

Второй аватар разворачивает person, а затем задаёт color: когда один и тот же пропс встречается дважды, побеждает последний, поэтому переопределения ставьте после spread. TextField оставляет label себе и передаёт type, placeholder и maxLength прямо в <input>. Используйте spread для таких обёрток; в остальных местах явное перечисление пропсов помогает видеть, что получает компонент.

Пропсы доступны только для чтения

Компонент никогда не должен менять собственные пропсы. Они принадлежат родителю, и один и тот же объект может использоваться совместно. Относитесь к ним как к аргументам функции, которые нельзя переприсваивать:

function Counter({ count }) {
    count = count + 1; // wrong: changes a local copy, the parent never sees it
    return <p>{count}</p>;
}

function Profile(props) {
    props.name = 'Someone else'; // wrong: in development React freezes props, so this throws a TypeError
    return <p>{props.name}</p>;
}

При этом пропсы со временем меняются. Когда родитель снова рендерится с новыми значениями, дочерний компонент получает новый объект пропсов и рендерится с ним:

Temperature никогда не меняет celsius. Он вычисляет из него fahrenheit при каждом рендере. Потяните ползунок, и состояние родителя изменится, поэтому дочерний компонент получит новый пропс. Если дочернему компоненту нужно значение, которое он может менять сам, это значение является состоянием, а не пропсом.

Пропсы и состояние

И пропсы, и состояние это обычные значения JavaScript, которые влияют на то, что рендерит компонент, и изменение любого из них снова рендерит компонент. Разница в том, кому принадлежит значение.

ПропсыСостояние
Откуда берётсяОт родителя, как атрибуты JSXИз самого компонента, из useState или useReducer
Может ли компонент его менятьНет, оно только для чтенияДа, через свой сеттер
Типичное применениеНастроить компонент: подпись, размер, данные для показаЗапомнить то, что меняется: текст в поле, открытое меню

Одно и то же значение часто бывает и тем, и другим. В примере с температурой выше celsius это состояние в App и пропс в Temperature. Владелец хранит его как состояние и передаёт вниз как пропс вместе с функцией для его изменения, когда это нужно дочернему компоненту.

Пропс может хранить любое значение, включая JSX и компоненты. Передача элемента, например icon={<StarIcon />}, позволяет родителю заполнить слот в дочернем компоненте, та же идея, что и у children, но с именем на ваш выбор.

Пропс children

Всё, что вы помещаете между открывающим и закрывающим тегами компонента, приходит как пропс с именем children. Так строятся обёртки вроде карточек, панелей и макетов, которые заранее не знают своего содержимого:

Страница о children разбирает передачу нескольких слотов и безопасную работу с children.

Ключи не являются пропсами

key выглядит как атрибут, но React оставляет его себе, чтобы сопоставлять элементы списка между рендерами. Компонент его никогда не получает:

Консоль показывает props.key как undefined, а props.id с настоящим значением. Когда дочернему компоненту нужен идентификатор, передайте его второй раз под другим именем, как здесь делает id. Сборка для разработки также предупреждает, когда вы читаете props.key; превью работает как продакшен-сборка, поэтому вы видите только undefined.

Часто задаваемые вопросы

Что такое пропсы в React?

Пропсы (сокращение от properties, свойства) это аргументы компонента. Родитель передаёт их как атрибуты JSX, <Avatar size={48} />, а дочерний компонент получает их одним объектом, обычно деструктурированным: function Avatar({ size }).

Как задать значение пропса по умолчанию?

Используйте значение по умолчанию при деструктуризации: function Button({ size = 'medium' }). Оно применяется, когда пропс отсутствует или равен undefined. React 19 убрал defaultProps для функциональных компонентов; классовые компоненты его по-прежнему поддерживают.

Может ли дочерний компонент менять свои пропсы?

Нет. Пропсы доступны только для чтения. Чтобы изменить то, что показывает дочерний компонент, родитель передаёт новые пропсы; чтобы дочерний компонент мог попросить об изменении, родитель передаёт функцию, например onChange, а дочерний её вызывает.

Чем пропсы отличаются от состояния?

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

Почему props.key равен undefined?

key (как и ref в старых версиях React) использует сам React, чтобы отслеживать элементы списка, и в компонент он не передаётся. Если дочернему компоненту нужно это значение, передайте его ещё раз под другим именем, например <Row key={id} id={id} />.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ