3 Кормилец доками 4 Направляющий 5 Почти архитектор ~10 мин

React и Next.js простыми словами: компоненты, пропсы, состояние

Сайт - это конструктор LEGO. И да, мигает он не просто так

React и Next.js на пальцах для вайбкодера: что такое компоненты, пропсы и состояние, чем сервер отличается от браузера и какими промптами просить у агента аккуратный сайт.

Скиллы ECC в этом уроке: react-patternsfrontend-patterns

Что такое React простыми словами

Строишь дом из LEGO. Ты ведь не лепишь его одним монолитным куском пластика. Кубик-окно, кубик-дверь, кубик-стена - собрал из деталей. Сделал один раз хороший кубик-окно - и втыкаешь куда захочешь, хоть двадцать штук подряд.

Вот React ровно про это. Конструктор для сайтов. Кнопка, карточка товара, шапка, форма - каждый кусок интерфейса - это компонент . Страница собирается из компонентов, как дом из кубиков. Скучно? Зато работает.

А Next.js - коробка LEGO «всё включено». Те же кубики React, но плюс готовые рельсы для страниц, адресов и сервера. На голом React ты собираешь домик. На Next.js - сразу город с дорогами и светофорами.

Слева монолитная серая глыба сайта, справа тот же сайт собранный из аккуратных LEGO-кубиков
Слева - сайт одной простынёй. Справа - тот же сайт из компонентов.

Зачем вайбкодеру разбираться в React

Ты вайбкодер. Код руками писать не обязан. Но почти любой сайт, который тебе сгенерит агент, окажется на React или Next.js - выбора особо нет. И если ты понимаешь, как это устроено, ты:

  • даёшь агенту команды на его языке, и он не «плывёт»;
  • понимаешь, почему правка одной кнопки вдруг сломала три других;
  • ловишь момент, когда агент клепает простыню вместо аккуратных кубиков, и отправляешь переделывать;
  • перестаёшь вздрагивать от слов «компонент», «пропс», «состояние» - а звучать они будут часто, привыкай.

Разница между «агент собрал сайт, который невозможно поменять» и «собрал сайт, который правится за минуту» - это понимание трёх вещей: компоненты, пропсы, состояние. С них и начнём.

Три кита React: компоненты, пропсы, состояние

Компоненты - это кубики LEGO

Каждый кусок интерфейса - отдельный кубик. Кнопка Купить, карточка товара, меню сверху. Правило, выстраданное практикой: компонент должен быть маленьким и про одно дело. Карточка показывает товар. Кнопка нажимается. Точка. Не лепи «мега-кубик», который умеет сразу всё на свете - такой потом сам же и проклянёшь.

Пропсы - данные, которые компонент получает снаружи

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

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

Один пустой шаблон-карточка, в который сверху насыпают разную начинку и получаются разные карточки
Один компонент. Разные пропсы. Много разных карточек.

Состояние (state) - память самого компонента

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

Магия React в одной фразе: поменялось состояние - экран сам обновляется. Руками лезть и переписывать страницу не надо. Закинул товар в корзину - циферка наверху обновилась сама. Удобно.

Сервер против браузера в Next.js: где живёт код

Вот тут новички путаются чаще всего. В Next.js код бывает двух сортов, и смешивать их нельзя.

  • Серверные компоненты работают на сервере. Они умеют лезть в базу данных, читать секретные ключи, готовить страницу заранее. А вот реагировать на клики и хранить состояние не умеют. Это «кухня»: там готовят блюдо, гостей туда не пускают.
  • Клиентские компоненты работают в браузере у пользователя. Клики, ввод, анимации, состояние - всё их. Это «зал»: там подают и общаются с гостем. Их помечают специальной строчкой use client в начале файла.
Серверный компонент хорош для
  • Загрузки данных из базы прямо при сборке страницы.
  • Работы с секретными ключами - они не утекают в браузер.
  • Тяжёлой статики: текст, картинки, SEO-страницы, которые редко меняются.
  • Меньше кода уезжает к пользователю → сайт грузится быстрее.
Клиентский компонент хорош для
  • Кнопок и кликов, на которые надо реагировать.
  • Полей ввода и форм с проверкой по ходу набора.
  • Всего, что открывается и закрывается: меню, модалки, табы.
  • Анимаций и любых эффектов прямо в браузере.

Хорошая и плохая сборка компонентов: как отличить

Агент собрал тебе сайт. Вот как на глаз отличить аккуратную сборку от той, к которой потом не подойдёшь.

Хорошая сборка на React
  • Страница разбита на маленькие кубики с понятными именами.
  • Один кубик переиспользуется с разными пропсами, а не копипастится.
  • В состоянии лежит только то, что реально меняется.
  • В списках у каждого элемента стабильный ключ (id), а не номер по порядку.
Плохая сборка на React
  • Вся страница - один гигантский файл на тысячу строк.
  • Один и тот же блок скопирован пять раз с мелкими правками.
  • В состоянии дублируется то, что можно посчитать из других данных.
  • Загрузка данных навешана криво → строчки прыгают и мигают при обновлении.

Пример из жизни: каталог товаров с поиском

Просишь агента: «сделай страницу с каталогом товаров и поиском». Он бодро выдаёт один файл на 900 строк, где всё свалено в кучу. Дальше просишь «поменяй карточку товара» - а он заодно ломает поиск, потому что всё переплетено в один клубок. А потом список при каждом нажатии клавиши мигает и дёргается, как будто у него нервный тик. Знакомо?

Что пошло не так:

  1. Не было кубиков - одна простыня, в которой всё цепляется за всё.
  2. Поисковый запрос летел в базу на каждую букву - отсюда и дёрганье.
  3. Данные грузились криво, поэтому список прыгал при каждом обновлении.

А теперь то же самое, но по-человечески, чтобы вышло аккуратно:

Промпт - скопируй и попробуй

Сделай страницу каталога товаров с поиском на React и Next.js. Требования:

  1. Разбей на маленькие компоненты: карточка товара, сетка карточек, поле поиска. Каждый компонент - про одно дело.
  2. Карточка товара получает все данные через пропсы и сама в базу никуда не лезет.
  3. В состоянии храни только то, что меняется: текст в поиске. Отфильтрованный список считай на месте, отдельно не храни.
  4. Поиск делай с задержкой примерно в полсекунды после остановки набора, а не на каждую букву, чтобы список не дёргался.
  5. У каждой карточки в списке поставь стабильный ключ по id товара, а не по номеру.

Сначала покажи структуру компонентов списком и жди моего ок, потом пиши код.

Почему сайт глючит и мигает: быстрая диагностика

Прежде чем злиться на агента, пробегись по чек-листу.

  1. Всё мигает и дёргается? Скорее всего, данные грузятся на каждый чих или поиск летит в базу на каждую букву. Попроси задержку и нормальную загрузку.
  2. Правка одного сломала другое? Значит, всё свалено в один кубик. Попроси разнести на компоненты поменьше.
  3. Цифры разошлись (в корзине одно, в сумме другое)? В состоянии дублируется то, что надо считать на месте. Попроси «выводить, а не хранить».
  4. Кнопка не нажимается, форма мёртвая в Next.js? Похоже, это серверный компонент, а нужен клиентский (use client).
  5. Тормозит длинный список? Если элементов сотни - попроси виртуализацию: рисуем только то, что видно на экране, остальное ждёт за кадром.
Мем: робот-агент копирует один и тот же блок кода в пятый раз и заявляет, что это и есть компонентный подход
Копипаст - это не переиспользование. Знакомо каждому.

Делаем красиво: доступность и понятные теги

Глава называется «Делаем красиво», так что держи короткое правило интерфейса: проси агента использовать обычные понятные HTML-теги: кнопка - это button, ссылка - a, меню - nav. Это не занудство ради занудства. Такие сайты работают с клавиатуры, их понимают читалки для незрячих и поисковики заодно. У каждого поля ввода должна быть подпись. Красивый сайт - это не только приятные цвета. Это ещё и то, что им могут пользоваться все, а не только мышка на большом мониторе.

Пиксель-арт: аккуратная мини-страница, собранная из светящихся кубиков-компонентов
Аккуратные кубики → аккуратный сайт.

Частые ошибки новичка в React

  • Просить «сделай всё в одном файле». Получишь простыню, которую невозможно менять. Проси кубики.
  • Думать, что копипаст равно переиспользование. Пять копий блока - это пять мест, где придётся чинить один и тот же баг. Один компонент с пропсами - одно место.
  • Дублировать данные в состоянии. Суммы, итоги, отфильтрованные списки - считай на месте, не храни отдельно.
  • Путать сервер и браузер в Next.js. Клики и ввод - клиентский кубик. Секреты и база - серверный.
  • Гнать поиск на каждую букву. Сайт дёргается и тормозит. Проси задержку.
  • Забывать про стабильные ключи в списках. Иначе при изменениях список запутается, что куда переставлять, и устроит чехарду.

TL;DR - если коротко

  • React - конструктор LEGO для сайтов: страница собирается из мелких блоков-компонентов, а не лепится одной гигантской простынёй.
  • Пропсы - начинка, которую ты кладёшь в блок снаружи. Состояние (state) - память самого блока: что нажато, что введено, что открыто.
  • Запомни одно: что видно на экране = пропсы + состояние. То, что можно посчитать на месте, в state не клади.
  • Next.js - это React с роутингом, страницами и сервером в комплекте. Часть кода живёт на сервере, часть в браузере - и путать их нельзя.
  • Тормоза и мигание - это почти всегда лишние перерисовки и данные не там, где надо. React тут ни при чём.
  • Поймёшь три кита - компоненты, пропсы, состояние - и агент перестанет собирать сайты, которые нельзя поменять.

Поиск по вики

Нажмите Esc для закрытия

Введите запрос для мгновенного поиска по всем страницам курсов и уроков.