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 для закриття

Введіть запит для миттєвого пошуку по всіх сторінках курсів та уроків.