1. Вёрстка интерфейса и создание базовых компонентов React
Вёрстка интерфейса и создание базовых компонентов React
Добро пожаловать в курс по React. Мы начинаем путь от создания статической вёрстки до построения сложной архитектуры. В этой статье мы разберем фундамент: как перестроить мышление с классического HTML/CSS на компонентный подход, что такое JSX и как сделать интерфейс живым с помощью состояния.
Смена парадигмы: от страниц к компонентам
В классической веб-разработке мы привыкли мыслить страницами: у нас есть index.html, about.html, и мы подключаем к ним стили и скрипты. React меняет этот подход. Вместо страниц мы строим интерфейс из независимых, переиспользуемых блоков — компонентов.
Согласно документации Next.js, компоненты можно представить как кирпичики LEGO: вы берете отдельные элементы и объединяете их для создания более крупных структур. > Если нужно обновить часть интерфейса, можно изменить конкретный компонент или «кирпичик». > > ru.nextjs.im
Императивный vs Декларативный подход
Чтобы понять React, нужно понять разницу между императивным и декларативным программированием.
Императивный (как в jQuery или ванильном JS): Вы говорите браузеру, как* сделать что-то шаг за шагом. «Найди элемент с ID btn, добавь ему класс active, измени текст на 'Загрузка'».
Декларативный (React): Вы описываете, что* хотите видеть в зависимости от данных. «Если isLoading равно true, покажи кнопку с текстом 'Загрузка' и классом active».
React берет на себя сложную работу по обновлению DOM (Document Object Model), чтобы привести интерфейс в соответствие с вашим описанием.
Настройка окружения
Для начала работы нам понадобится Node.js. Раньше стандартом был create-react-app, но сегодня индустрия перешла на Vite — это инструмент сборки, который работает значительно быстрее.
Для создания проекта выполните команду в терминале:
После запуска вы увидите локальный адрес (обычно http://localhost:5173), где отображается ваше приложение.
JSX: HTML внутри JavaScript
React использует синтаксис JSX (JavaScript XML). На первый взгляд это похоже на HTML, который мы пишем прямо внутри JavaScript-файла. Однако браузеры не понимают JSX, поэтому инструменты сборки (например, Vite) трансформируют его в обычный JavaScript перед тем, как код попадет в браузер.
Ключевые отличия JSX от HTML
div в DOM-дереве, используйте Фрагмент: <> ... </>.class зарезервировано, поэтому в JSX мы используем className.<img> в HTML может быть открытым, но в JSX он обязан выглядеть как <img />.onClick, tabIndex.Интерполяция данных
Самая мощная возможность JSX — вставка JavaScript-выражений прямо в разметку с помощью фигурных скобок {}.
Внутри фигурных скобок может быть любое валидное JS-выражение: математические операции, тернарные операторы или вызовы функций.
Анатомия React-компонента
Современный React использует функциональные компоненты. Это обычные JS-функции, которые возвращают JSX.
Важное правило: Название функции компонента обязательно должно начинаться с заглавной буквы. React использует это, чтобы отличать ваши компоненты (например, <UserCard />) от встроенных HTML-тегов (например, <div>).
Пример базового компонента:
Теперь этот компонент можно импортировать и использовать в другом файле, например в App.jsx:
Props: Передача данных
Компоненты были бы бесполезны, если бы они всегда рендерили одно и то же. Чтобы сделать их динамическими, мы используем Props (пропсы/свойства). Это данные, которые родительский компонент передает дочернему. Они работают аналогично атрибутам в HTML.
Пропсы доступны в первом аргументе функции-компонента. Обычно мы сразу деструктурируем этот объект для удобства.
Создадим компонент карточки товара ProductCard:
Использование компонента с разными данными:
Важно: Пропсы доступны только для чтения. Дочерний компонент не может изменять полученные пропсы. Данные в React текут сверху вниз (однонаправленный поток данных).
State: Добавляем интерактивность
Пропсы позволяют настраивать компонент извне, но что если компонент должен меняться сам в ответ на действия пользователя? Например, счетчик лайков или раскрывающееся меню. Для этого используется State (состояние).
В React переменные не работают так, как вы привыкли. Если вы создадите переменную let count = 0 и измените её по клику, React не узнает об этом и не перерисует интерфейс. Чтобы React отреагировал на изменение данных, нужно использовать хук useState.
Хук useState
useState — это функция, которая возвращает массив из двух элементов:
Когда вы вызываете setCount, React понимает, что данные изменились, запускает функцию компонента заново, вычисляет новый JSX и обновляет только нужную часть DOM в браузере.
Рендеринг списков
В реальных приложениях мы редко вставляем компоненты по одному вручную. Обычно данные приходят в виде массива объектов (например, от API). Для отображения списков в React используется метод массива .map().
Предположим, у нас есть массив товаров:
Мы можем превратить этот массив данных в массив компонентов:
Зачем нужен атрибут key?
Обратите внимание на атрибут key={product.id}. Это обязательное требование React при рендеринге списков. Ключ должен быть уникальным идентификатором элемента среди соседей.
Ключи помогают React определить, какие элементы были изменены, добавлены или удалены. Это критически важно для производительности и корректного сохранения состояния элементов (например, фокуса в полях ввода) при сортировке или фильтрации списка.
Никогда не используйте индекс массива (второй аргумент map) в качестве ключа, если порядок элементов может меняться. Это приведет к ошибкам в работе интерфейса.
Стилизация компонентов
В React есть несколько способов стилизации. В рамках этого курса мы начнем с самого простого и надежного — CSS Modules или обычного CSS.
При использовании обычного импорта (import './App.css') стили становятся глобальными, что может привести к конфликтам имен классов. Поэтому хорошей практикой является использование CSS Modules.
Button.module.css..btn { background: blue; }.import styles from './Button.module.css'.<button className={styles.btn}>...</button>.Это гарантирует, что стили кнопки не повлияют на другие элементы, так как сборщик автоматически сгенерирует уникальные имена классов (например, _btn_x7z1a).
Итоги
Мы рассмотрели базу, необходимую для старта разработки на React. Главное — научиться декомпозировать интерфейс на независимые части.
* Компоненты — это функции, возвращающие JSX. Они позволяют разбивать интерфейс на переиспользуемые блоки.
* JSX требует соблюдения правил: className вместо class, закрытие всех тегов и наличие одного родительского элемента.
* Props используются для передачи данных от родителя к ребенку (только чтение).
* State (useState) позволяет компонентам хранить и изменять собственные данные, реагируя на действия пользователя.
* Списки рендерятся через .map(), и каждому элементу обязательно нужен уникальный key.