Олег Марков
Что такое props в React и как их правильно использовать
Введение
Когда вы начинаете работать с React, одним из первых понятий, с которым вы сталкиваетесь, становятся props. Это фундаментальная часть архитектуры React, позволяющая компонентым "общаться" между собой. Props — это механизм передачи данных от родительского компонента к дочернему. На них строится большая часть связей в ваших приложениях, поэтому понимание того, что такое props и как их правильно использовать, критически важно для любого frontend-разработчика, работающего с React.
Давайте подробно разберёмся, как именно работают props, зачем они нужны, какие задачи решают, и какие лучшие практики стоит использовать для построения масштабируемых и предсказуемых интерфейсов.
Зачем нужны props
В React основная идея — разбивать интерфейс на независимые, изолированные части, называемые компонентами. Для того чтобы эти компоненты могли взаимодействовать, родительские компоненты должны иметь возможность "скармливать" данные своим детям. Props предоставляют для этого готовый механизм. Благодаря props ваши компоненты становятся:
- Гибкими (можно переиспользовать компонент с разными данными)
- Упорядоченными (данные текут сверху вниз)
- Предсказуемыми (передача данных — односторонняя)
С помощью props вы определяете, чем именно будет наполнен каждый экземпляр компонента. Важно отметить, что props неизменяемы в пределах дочернего компонента — вы задаёте их при создании компонента и используете внутри, но не должны менять.
Как устроены props в React
Передача props
Рассмотрим простой пример. Допустим, у вас есть компонент Greeting
, который отображает приветствие. Вы хотите, чтобы можно было передавать имя пользователя, которому адресовано приветствие.
// Пример передачи props в React
// Компонент, принимающий prop name
function Greeting(props) {
return <h1>Hello, {props.name}!</h1>;
}
// Использование компонента с разными значениями props
function App() {
return (
<div>
<Greeting name="Алексей" /> // На экран выведет: Hello, Алексей!
<Greeting name="Ирина" /> // На экран выведет: Hello, Ирина!
</div>
);
}
Здесь компонент Greeting
— "чистый" компонент, он получает props как входные данные. Родительский компонент (в этом случае App
) определяет, какие значения будет иметь prop name
для каждого экземпляра Greeting
.
Props
(properties) - это способ передачи данных от родительского компонента к дочернему в React. Правильное использование props является ключевым для создания переиспользуемых и гибких компонентов. Если вы хотите детальнее изучить props
в React и научиться правильно их использовать — приходите на наш большой курс Основы React, React Router и Redux Toolkit. На курсе 177 уроков и 17 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.
Как работает объект props
В каждом компоненте props — это обычный JavaScript-объект. В классических функциональных компонентах его можно получить в качестве аргумента функции. Если вас интересует, что лежит внутри props, вы можете вывести его при помощи консольного вывода.
// Посмотрим, что передаётся через props
function ShowProps(props) {
console.log(props); // Выведет { example: "значение" }
return <div>{props.example}</div>;
}
Если вы передаёте несколько props, все они становятся свойствами этого объекта.
Деструктуризация props
Часто вы встретите в примерах запись, где props сразу "разбирают" на отдельные переменные — такой подход облегчает чтение кода:
function Greeting({ name }) {
// Теперь доступ к name напрямую, без props.name
return <h1>Hello, {name}!</h1>;
}
Этот метод хорош, когда ваш компонент использует несколько props и вам важно сделать код компактнее и понятнее.
Передача props с помощью spread-оператора
Иногда возникает задача передать все props сразу или проксировать их дальше. Для этого удобно воспользоваться spread-оператором.
// Передача всех props в дочерний компонент
function Input(props) {
return <input {...props} />; // Все props попадут сразу в <input />
}
// Использование:
<Input type="text" placeholder="Введите имя" maxLength={20} />
Обратите внимание: spread-оператор помогает "перекидывать" все props, но требует внимательности — не забывайте, что так можно нечаянно переопределить имеющиеся атрибуты или случайно пробросить лишние свойства.
По умолчанию: значения по умолчанию для props
Иногда вы хотите, чтобы компонент адекватно работал, даже если родитель не передал некоторые props. Для таких случаев в функциональных компонентах удобно указывать значения по умолчанию через деструктуризацию или с помощью ES6 параметров по умолчанию.
function WelcomeMessage({ name = "гость" }) {
return <div>Добро пожаловать, {name}!</div>;
}
Если prop name
не был передан, будет использовано значение "гость"
.
Ограничение типов props с помощью PropTypes
React не требует указывать тип props, но для стабильности и упрощения сопровождения кода рекомендуется использовать библиотеку PropTypes.
Давайте посмотрим, как это работает:
import PropTypes from 'prop-types';
function UserCard({ name, age }) {
return (
<div>
<span>{name}</span>
<span>{age} лет</span>
</div>
);
}
UserCard.propTypes = {
name: PropTypes.string.isRequired, // Требуется строка
age: PropTypes.number, // Может быть числом, не обязательно
};
Использование PropTypes особенно важно в больших командах, чтобы избежать ошибок при передаче props не того типа. Если вы укажете неправильный тип, React отобразит предупреждение в консоли.
Работа с функциями как props
Одна из мощнейших возможностей props — возможность передавать не только данные, но и функции обратного вызова. Так родительский компонент может "научить" дочерний компонент взаимодействовать с общим состоянием или реагировать на события.
Рассмотрим пример:
function Button({ onClick, children }) {
return <button onClick={onClick}>{children}</button>;
}
function App() {
const handleClick = () => {
alert('Кнопка нажата!');
};
return (
<Button onClick={handleClick}>
Нажми меня!
</Button>
);
}
В этом примере App передаёт функцию handleClick как prop onClick
компоненту Button, и когда пользователь нажимает на кнопку, вызывается переданная функция.
Children: специальный prop для вложенных компонентов
React добавляет специальный prop children
, с помощью которого приходят все вложенные компоненты или элементы, которые вы помещаете между тегами компонента.
// Компонент-контейнер
function Card({ children }) {
return <div className="card">{children}</div>;
}
// Использование
<Card>
<h2>Заголовок</h2>
<p>Описательный текст внутри карточки.</p>
</Card>
Компонент Card может выводить внутри себя любое содержимое, передаваемое между его тегами.
Как props отличаются от state
Props — это входные данные компонента, которые могут быть изменены только родителем. Comпонент принципиально не должен менять собственные props. Вся логика изменения данных внутри компонента реализуется через state.
- Props — неизменяемы, определяются вне компонента
- State — изменяется внутри компонента, управляет "внутренним" состоянием
Вот почему говорят, что "данные в React текут сверху вниз."
Лучшие практики использования props
Чтобы ваши компоненты были читаемыми, переиспользуемыми и масштабируемыми, важно соблюдать несколько рекомендаций:
- Используйте деструктуризацию props там, где это возможно, чтобы код оставался чистым
- Явно описывайте все ожидаемые props в PropTypes или через TypeScript
- Передавайте только те props, которые реально нужны дочернему компоненту
- Не изменяйте props внутри компонента. Никогда не делайте попытку написать
props.value = 42;
- Используйте spread-оператор для проксирования props только если это действительно необходимо
- Не передавайте большие "глыбы" данных или сложные объекты, если компонент может работать с меньшим набором props
Когда стоит использовать props
Props можно использовать почти во всех случаях, когда необходимо "настроить" дочерний компонент или отдать ему функцию управления. К стандартным случаям относятся:
- Передача строк, чисел, массивов и других примитивных данных
- Проксирование обработчиков событий
- Передача ссылок на DOM-элементы (через ref)
- Передача стилей или классов
- Использование
children
для динамических вложенных элементов
Глубокая вложенность: другие способы передачи данных
Иногда props приходится передавать через несколько уровней вложенности, что приводит к так называемому "props drilling". Это может затруднить чтение и сопровождение кода. Для решения подобных задач в крупных приложениях используют:
- Контекст (Context API)
- State management библиотеки (Redux, MobX и другие)
Оптимально держать структуру передачи props максимально плоской и избегать глубокого props drilling, иначе проект может стать сложным для поддержки.
Передача значений по ссылке и по значению
В React, как и в JavaScript, простые типы (строки, числа, булевы значения) передаются по значению, а объекты и массивы — по ссылке. Поэтому, если вы передаёте объект или массив через prop, изменения в этом объекте родительского компонента отразятся в дочернем. Это может быть как удобным, так и подводить к неожиданным ошибкам, если допустить прямое изменение таких props.
// Передача массива по ссылке
function List({ items }) {
return <ul>{items.map(item => <li key={item}>{item}</li>)}</ul>;
}
const myItems = ["яблоко", "банан"];
<List items={myItems} />
// Если изменить myItems где-то ещё, это повлияет на компонент
Чтобы избежать подобных ошибок, рекомендуется работать с копиями массивов и объектов при необходимости изменения данных.
Передача динамических props
Вы можете использовать любые выражения JavaScript при передаче props, включая результаты вызова функций, условия или целые объекты.
function Status({ online }) {
return <span>{online ? "Сейчас на сайте" : "Оффлайн"}</span>;
}
<Status online={user.isOnline} />
Это позволяет максимально динамически строить поведение компонентов.
Пример комплексного компонента с props
Давайте объединим все вместе в большем примере.
import PropTypes from 'prop-types';
function ProductCard({ product, onBuy, showDiscount = false }) {
return (
<div className="product">
<h3>{product.name}</h3>
<span>Цена: {product.price} ₽</span>
{showDiscount && product.discount && (
<span>Скидка: {product.discount}%</span>
)}
<button onClick={() => onBuy(product.id)}>
Купить
</button>
</div>
);
}
ProductCard.propTypes = {
product: PropTypes.shape({
id: PropTypes.number.isRequired,
name: PropTypes.string.isRequired,
price: PropTypes.number.isRequired,
discount: PropTypes.number,
}).isRequired,
onBuy: PropTypes.func.isRequired,
showDiscount: PropTypes.bool,
};
Здесь и объект для передачи, и функция, и опциональное свойство — всё, с чем обычно работают в реальных проектах.
Заключение
Props — базовый и при этом очень гибкий механизм для передачи информации между компонентами React. С помощью props ваши компоненты могут быть универсальными, "умеющими подстраиваться" под разные сценарии и требования. Главное — всегда помните об одностороннем потоке данных, неизменяемости props и своевременно уточняйте типы передаваемых данных. Соблюдая простые правила и лучшие практики, вы быстро научитесь строить надёжные и масштабируемые пользовательские интерфейсы на основе React.
Props позволяют передавать данные между компонентами. Для создания сложных приложений требуется умение управлять состоянием и роутингом. Курс Основы React, React Router и Redux Toolkit научит вас всему необходимому. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в основы React уже сегодня.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как правильно обновлять props внутри дочернего компонента?
Props нельзя изменять в дочернем компоненте напрямую. Если нужно обновить значение, требуйте обновления данных через функцию, переданную родителем. Например:
// В родителе:
<Child value={count} onChange={setCount} />
// В дочернем:
function Child({ value, onChange }) {
return (
<button onClick={() => onChange(value + 1)}>+</button>
);
}
Всё управление — через родительскую функцию.
Можно ли присваивать props значения внутри компонента?
Нельзя. Если вы выполните props.x = 10
, это приведёт к ошибке или к неожиданному поведению вашей программы. Все изменения должны идти через управление state у родителя.
Как можно устанавливать значения по умолчанию для props в классовых компонентах?
Используйте свойство defaultProps:
class Greeting extends React.Component {}
Greeting.defaultProps = {
name: "Гость"
};
Теперь проп name будет иметь дефолт "Гость", если ничего не передано.
Как лучше передать объект или массив в props, чтобы избежать нежелательных изменений?
Передавайте копию объекта или массива через spread или методы массивов:
<Child items={[...arr]} /> // если arr изменится, props не поменяется
Как можно пробросить все props сразу дочернему компоненту?
Используйте spread оператор:
<ChildComponent {...props} />
Но будьте осторожны, чтобы не пробросить лишние или конфликтующие свойства. Проверяйте структуру props на каждом уровне вложенности.
Постройте личный план изучения React до уровня Middle — бесплатно!
React — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по React
Лучшие курсы по теме

React и Redux Toolkit
Антон Ларичев
TypeScript с нуля
Антон Ларичев