Учебник React для начинающих
React — самая популярная библиотека для создания пользовательских интерфейсов. Этот курс рассчитан на тех, кто уже владеет HTML, CSS и базовым JavaScript (ES6+) и хочет научиться строить современные веб-приложения. Вы пройдёте путь от создания первого проекта на Vite и понимания JSX до компонентов, пропсов, состояния через useState, эффектов через useEffect, Context и кастомных хуков. Завершим практикой: форма с валидацией и мини-проект todo-список, а также обзор роутинга, стилизации и дальнейшего пути обучения. Упор на понимание «почему», корректные примеры и разбор частых ошибок: мутация состояния, отсутствие key, бесконечный useEffect.
Курс «React» состоит из 8 разделов и 39 уроков: Введение в React, Компоненты и пропсы, Состояние и хук useState, Эффекты и жизненный цикл, Передача данных и переиспользование, Практика и экосистема, Производительность React и Продвинутые паттерны. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в React
- Зачем нужен React
Чем декларативный подход React лучше ручного управления DOM: компоненты, реактивность и переиспользование вместо querySelector и innerHTML.
- Создание проекта на Vite
Как создать React-проект командой npm create vite, разобраться в структуре папок, запустить дев-сервер и понять роль main.jsx, App.jsx и index.html.
- JSX: что это и зачем
JSX — это синтаксис, который позволяет писать разметку прямо в JavaScript. Разбираем, во что он превращается и почему это не строка и не HTML.
- Правила JSX
Один корневой элемент, className вместо class, закрытие всех тегов, фрагменты и camelCase для атрибутов — главные правила JSX, на которых спотыкаются новички.
- Зачем нужен React
2 Компоненты и пропсы
- Функциональные компоненты
Что такое функциональный компонент в React: обычная функция, возвращающая JSX. Имя с большой буквы, экспорт и использование как тега.
- Пропсы: передача данных
Props — это способ передать данные из родительского компонента в дочерний. Передача атрибутами, чтение через параметр и деструктуризация.
- props.children и композиция
Как через props.children передать содержимое между тегами компонента и собирать сложные интерфейсы из мелких компонентов — композиция вместо наследования.
- Условный рендеринг
Как показывать разметку по условию: оператор &&, тернарный оператор и возврат разных JSX. Частая ошибка с нулём и оператором &&.
- Списки и ключи (key)
Как рендерить массивы через map, зачем нужен проп key, почему индекс массива — плохой ключ и к каким багам приводит его отсутствие.
- Функциональные компоненты
3 Состояние и хук useState
- Что такое состояние
Чем состояние (state) отличается от пропсов, почему обычная переменная не перерисовывает компонент и зачем React нужен особый механизм памяти.
- Хук useState
Объявление состояния через useState, обновление через setter и перерисовка. Синтаксис деструктуризации массива и начальное значение.
- Иммутабельность состояния
Почему нельзя мутировать массивы и объекты в состоянии напрямую: React сравнивает по ссылке. Как обновлять иммутабельно через spread и map.
- Обработка событий
Как навешивать обработчики onClick, onChange и другие, передавать аргументы, читать объект события и избегать ошибки с немедленным вызовом функции.
- Формы и controlled inputs
Что такое управляемый компонент (controlled input): значение поля живёт в состоянии. Связка value + onChange и работа с несколькими полями.
- Что такое состояние
4 Эффекты и жизненный цикл
- Хук useEffect и зависимости
Что такое побочный эффект, как работает useEffect, зачем нужен массив зависимостей и чем отличаются пустой массив, его отсутствие и список значений.
- Очистка эффекта
Зачем useEffect возвращает функцию очистки, как убирать таймеры и подписки, и почему без очистки возникают утечки памяти и двойные подписки.
- Загрузка данных в useEffect
Как загружать данные с сервера через fetch внутри useEffect: состояния loading, error и data, и почему бесконечный цикл — главная ошибка новичка.
- Правила хуков и useRef
Два правила хуков: вызывать только на верхнем уровне и только из компонентов. Плюс хук useRef для ссылок на DOM и хранения значений без перерисовки.
- Хук useEffect и зависимости
5 Передача данных и переиспользование
- Подъём состояния (lifting state up)
Как двум компонентам делить общее состояние: поднимаем его в общего родителя и передаём вниз значение и функцию обновления.
- Prop drilling и Context
Что такое prop drilling и почему он неудобен. Как Context и хук useContext передают данные сквозь дерево без промежуточных пропсов.
- Кастомные хуки
Как вынести повторяющуюся логику с состоянием в собственный хук use-функцию: правила именования, возврат значений и переиспользование между компонентами.
- useMemo и useCallback
Как useMemo кеширует результат вычисления, а useCallback — саму функцию, зачем это нужно для оптимизации и почему не стоит оборачивать в них всё подряд.
- Подъём состояния (lifting state up)
6 Практика и экосистема
- Форма с валидацией
Собираем управляемую форму регистрации с проверкой полей: состояние значений и ошибок, валидация при отправке и вывод сообщений пользователю.
- Мини-проект: список дел
Собираем классический todo-список: добавление, удаление и отметка выполнения задач через иммутабельные обновления массива в состоянии.
- Роутинг с react-router
Обзор клиентского роутинга в React: что такое SPA, как react-router сопоставляет URL компонентам через Routes, Route и Link без перезагрузки страницы.
- Стилизация и что учить дальше
Обзор способов стилизации React-компонентов (CSS-файлы, CSS-модули, инлайн) и дорожная карта дальнейшего обучения: state-менеджеры, Next.js, TypeScript.
- Форма с валидацией
7 Производительность React
- Как работает рендеринг и реконсиляция
Render против commit, почему компонент перерисовывается, реконсиляция по типу и key, и почему лишний рендер обычно дёшев.
- Лишние ре-рендеры и как их найти (Profiler)
Сначала измерь, потом оптимизируй: React DevTools Profiler, flame graph, причины рендера и ручная диагностика через console.log.
- React.memo: мемоизация компонента
Как React.memo пропускает рендер при равных пропсах, почему новые ссылки его ломают и когда memo вреден.
- useMemo и useCallback: равенство ссылок
Равенство ссылок в JS, useMemo для значений и useCallback для функций, когда мемоизация нужна, а когда только вредит.
- Стабильные ключи и списки
Зачем нужен key, почему индекс массива — плохой ключ, как сдвиг индексов ломает состояние и какие ключи правильные.
- Разделение кода, ленивая загрузка и виртуализация
React.lazy и Suspense для code splitting по маршрутам, идея виртуализации длинных списков и когда эти техники оправданы.
- Как работает рендеринг и реконсиляция
8 Продвинутые паттерны
- Кастомные хуки вглубь
Что кастомный хук делает на самом деле, как он переиспользует логику (а не данные) и как хуки компонуются друг из друга.
- useReducer: reducer как чистая функция
Когда useReducer удобнее useState, reducer как чистая функция (state, action) => newState, иммутабельность и тестируемость.
- Context правильно: без лишних ре-рендеров
Контекст против prop drilling, стабилизация value через useMemo, разделение контекстов и отдельный стабильный dispatch.
- Compound components
Составные компоненты: общий контекст, декларативная сборка как у select/option и статические свойства вроде Tabs.Tab.
- Render props и HOC (обзор)
Классические паттерны переиспользования логики: render props и HOC, их минусы и почему сегодня предпочитают кастомные хуки.
- Error boundaries
Как перехватить ошибку рендера и показать запасной UI: getDerivedStateFromError, componentDidCatch и что boundary не ловит.
- Portals и refs (forwardRef, useImperativeHandle)
createPortal для модалок и тултипов, forwardRef для проброса ref и useImperativeHandle для узкого императивного API.
- Кастомные хуки вглубь