📦 React Пропсы
🚀 Введение
Приложение в React строится из компонентов — строительных блоков. Эти компоненты могут состоять
как из простых JSX-элементов (аналогов HTML-тегов), так и из других компонентов. На верхнем уровне
всегда есть App-компонент, в который вложены остальные.
React-приложения строятся из компонентов - строительных блоков пользовательского интерфейса:
Ключевые принципы:
- Иерархия: Компоненты образуют древовидную структуру
- Корневой компонент:
App- верхний уровень приложения - Вложенность: Компоненты могут содержать другие компоненты или JSX-элементы
- Переиспользуемость: Компоненты проектируются так, чтобы их можно было использовать в разных местах приложения.
- Изоляция: Каждый компонент инкапсулирует свою разметку, стили и поведение (состояние, обработчики событий).
- Пропсы (props): Позволяют передавать данные от родителя к дочернему компоненту.
- Состояние (state): Определяет, как компонент реагирует на изменения данных внутри себя.
- Чистота функций: Функциональные компоненты часто реализуются как «чистые» — они возвращают UI, основываясь только на входных данных (props).
React отвечает за отрисовку UI на основе данных, используя алгоритм рендера.
Данные — первичны, именно они определяют внешний вид интерфейса.
🏗️ Компоненты и данные
- Компоненты могут быть составными: один компонент включает в себя другие.
- Данные внутри компонента могут храниться с помощью
useState. Это называется локальныйstate. - Однако часто данные должны быть доступны нескольким компонентам. Для этого их поднимают выше — в родительский компонент.
Принцип: Информационный эксперт — хранит данные и функции для их изменения там, где это логично и удобно
💓 Данные - сердце React
React без данных — это просто картинка. Когда появляются данные (state) — всё оживает.
Stateхранит локальные данные (состояние).- Каждый экземпляр компонента имеет собственное состояние.
- Где хранить
state? У того, кто является информационным экспертом.
📦 Props ('Пропсы')
Props (сокращение от properties — «свойства») — это механизм для передачи данных от
родительского компонента к дочернему в React и других подобных фреймворках (Vue, Svelte и
т.д.).
- Представьте, что компоненты — это функции, а
props— это их аргументы.
🔑 Ключевые характеристики Props
- Однонаправленный поток данных: Данные передаются только сверху вниз, от родителя к ребенку.
Данные передаются
по ссылке, а не копируются. 📤📥
Передача данных вниз по иерархии может идти через несколько уровней — это называется props drilling.
-
Только для чтения (
Read-Only): Компонент-получатель не может изменять (мутировать) своиprops. Он должен рассматривать их как константы. 📖 -
Любые типы данных: В
propsможно передавать не только строки и числа, но и массивы, объекты, функции и даже другие компоненты. 🎭
🎭 Типы компонентов
Smart/Container Components / Контейнерные компоненты ("Умные")
- Smart/Container Components — управляют состоянием, загружают данные, принимают решения.
- Presentational/Dumb Components — только принимают данные через пропсы и отображают их.
Характеристики:
- Управляют состоянием 🎛️
- Содержат бизнес-логику 💼
- Загружают данные 🌐
- Передают данные презентационным компонентам 📤
🎨 Presentational/Dumb Components / Презентационные компоненты ("Глупые")
Характеристики:
- Получают данные через пропсы 📥
- Отвечают только за отображение 🖼️
- Не содержат собственного состояния ⚡
- Легко переиспользуются 🔄
Сегодня строгого разделения почти не придерживаются — часто встречаются смешанные варианты: часть логики и часть отображения.
React-компоненты должны стремиться быть чистыми функциями (pure-function):
- не изменять входящие данные,
- всегда возвращать одинаковый результат при одинаковых входных данных.
🔄 Процесс перерисовки (Рендер)
Когда компонент получает новые пропсы? 📬
Только при перерисовке родительского компонента
Цепочка перерисовок:
Особенности:
- Перерисовывается родительский компонент и все потомки (вложенные компоненты) 🌳
🎯 Локальная перерисовка
Особенности:
- Перерисовывается только этот компонент
- Родитель и соседи не затрагиваются
- Используются те же пропсы
⚡ Передача пропсов на практике
Пример: список треков и отдельные элементы списка.
- Родительский компонент
Appхранит массив треков.
- Он пробрасывает их в компонент
TrackList.
key при рендере списковTrackListрендерит список, прокидывая каждый трек вTrackItem.
TrackItemполучает данные черезpropsи отображает.
⚠️ ⚠️ ⚠️ Важные моменты:
- ❗Данные, пришедшие в пропсах, должны использоваться только для отображения, а не изменяться.
- ❗Можно передавать как отдельные свойства (например,
id,title), так и целый объект. Всё зависит от задачи. - ❗В списках необходимо использовать уникальный
key, чтобы React правильно отслеживал элементы. Для этого идеально подходитid. Если использоватьindex, это может привести к проблемам, т.к. при добавлении / удалении элементов из массива индексы могут меняться.
🔗 Взаимосвязь компонентов
- Родитель зависит от дочерних компонентов, потому что импортирует их.
- "Зависимость" означает:
- ✅ Родитель содержит дочерние компоненты в своем JSX
- ✅ Без дочерних компонентов родитель не был бы полным
- ✅ Изменения в дочерних компонентах могут влиять на родителя
- Поток данных и управление идут от родителя к ребёнку.
- Дети не знают о родителе, они только принимают данные.
🔍 Что на самом деле означает "зависит":
- Статическая зависимость на этапе компиляции
- Зависимость в дереве рендера
Родительский компонент "знает" о дочерних, потому что они являются частью его JSX:
🎯 Итог
- В
Reactвсё строится из компонентов. - Данные могут храниться локально или подниматься выше.
- Основной механизм передачи данных вниз —
props. - Компоненты делятся на умные 🧠 (управляют состоянием) и простые 🎨 (отрисовывают).
- При проектировании важно определить, где будет храниться состояние и как данные будут передаваться вниз.
Props drilling— естественный процесс, который нужно уметь использовать, прежде чем оптимизировать.
⚡ Производительность и оптимизация
Влияние структуры данных на производительность
-
Поднятие состояния наверх может вызывать избыточные перерисовки
-
Локальное состояние уменьшает область перерисовки
-
Правильное расположение состояния улучшает производительность
💡 Рекомендации по оптимизации
-
Декомпозиция --> разбиение на мелкие компоненты
-
Локальное состояние --> для данных, нужных только одному компоненту
-
Поднятие состояния --> для данных, нужных нескольким компонентам
-
Избегание избыточных пропсов --> передавайте только нужные данные
🏠 Домашнее задание
Цель задания:
Сформировать глубокое понимание механизма props в React и научиться правильно передавать данные
между компонентами для создания гибких и переиспользуемых интерфейсов.
Задание 1
Отрисовка данных и пробрасывание пропсов
Создай новое приложение в котором будешь проделывать домашнее задание либо пиши код в уже существующем приложении
- Создай компонент
UserCard.tsx, который принимает следующиеprops:
id(number) - идентификатор пользователяname(string) - имя пользователяage(number) - возрастemail(string) - электронная почтаavatar(string) - URL аватарки
Компонент должен отображать карточку пользователя с этой информацией.
- Создай компонент
Users.tsxв котором используя компонентUserCard.tsx, пробросив необходимые пропсы, отрисуй пользователей
Итоговый результат 🚀

Задание 2
Проверка на возраст и аватар
Расширь задание 1, добавив следующие условия
- Если
avatarне передан, показывай заглушку "no photo"
В качестве заглушки используй placehold (const defaultAvatar = 'https://placehold.co/128?text=no+photo')
- Если
ageменьше 18, добавь к возрасту значок "🔞"
Итоговый результат 🚀

Задание 3
Создание списка продуктов. Двойная передача пропсов
Создайте приложение для отображения списка продуктов
- Главный компонент
Appдолжен:
- Хранить массив продуктов в состоянии
- Передавать его в
ProductList
Данные для тестирования:
- Компонент
ProductListдолжен:
- Принимать props
items(массив продуктов) - Отрисовывать список
ProductItemкомпонентов - Каждый элемент должен иметь уникальный key
- Компонент
ProductItemдолжен принимать props:
product(object) с полями:id,name,price,category- Отображать название, цену и категорию
Итоговый результат 🚀

Задание 4
Добавление товаров в корзину
Расширь задание 3, добавив следующие условия:
-
Добавь для каждого товара кнопку с названием 'добавить в корзину'
-
Добавь локальное состояние показывающее добавлен товар в корзину или нет.
const [inCart, setInCart] = useState(false) -
При нажатии на кнопку 'добавить в корзину' пользователь должен увидеть:
- Всплывающее сообщение alert в котором пользователь увидит сообщение "Товар добавлен в корзину"
- Название кнопки изменится на 'товар в корзине' и цвет кнопки станет желтым
- При нажатии на кнопку 'товар в корзинеу' пользователь должен увидеть обратную операцию:
- Всплывающее сообщение alert в котором пользователь увидит сообщение "Товар удален из корзины"
- Название кнопки изменится на 'добавить в корзину' и цвет кнопки станет белым
Итоговый результат 🚀

Задание 5
Добавление товаров в корзину
Поставь в каждом компоненте логи (console.log) и пронализируй в какой момент компонент рендерится.
Нажми на кнопку 'добавить в корзину' и также предугай какие логи ты увидишь
console.log('🔶 App')console.log('📋 ProductList')console.log('🧺 ProductItem')
🤔 Вопросы для самопроверки
- Что такое
propsи как они передаются в компоненты? - В чем разница между
propsиstate? - Как компонент может получить новые
props? - Что такое
props drillingи какие проблемы он создает? - Когда происходит перерендер дочерних компонентов?
🔶 Помни: каждая задача отражает реальные паттерны из коммерческой разработки — от простых карточек до сложных систем фильтрации.
🔶 Экспериментируй: изменяй props, добавляй console.log в компоненты и наблюдай за порядком
рендеров.
🔶 Удачи! Понимание props — это фундамент для работы с любой React-архитектурой. 🚀


