react

React — JavaScript-библиотека для построения пользовательских интерфейсов, разработанная командой Facebook (Meta) и открытая в 2013 году. Она позволяет создавать веб-приложения из независимых, переиспользуемых компонентов, каждый из которых управляет собственным состоянием. React не является полноценным фреймворком — он отвечает только за слой представления (View), оставляя выбор маршрутизации, управления состоянием и серверной части на усмотрение разработчика.

Компонентная модель React

Основная единица React-приложения — компонент. Компонент принимает входные данные (props), описывает, как должен выглядеть UI, и возвращает JSX — синтаксическое расширение JavaScript, позволяющее записывать разметку прямо в коде:

function Greeting({ name }) { return <h1>Привет, {name}!</h1>; }

JSX компилируется в вызовы React.createElement, то есть является синтаксическим сахаром, а не отдельным языком. Компоненты бывают функциональными (рекомендованный способ начиная с 2019 года) и классовыми (устаревший подход, но всё ещё встречается в легаси-коде).

Виртуальный DOM и алгоритм согласования

При изменении состояния React не обновляет реальный DOM напрямую. Вместо этого он строит новое виртуальное дерево (Virtual DOM) — лёгкое JavaScript-представление DOM — и сравнивает его с предыдущей версией через алгоритм reconciliation (согласование, «diffing»). Только реально изменившиеся узлы обновляются в настоящем DOM. Это уменьшает количество дорогостоящих операций с браузерным DOM и повышает производительность интерфейсов с частыми обновлениями.

В React 18 появился конкурентный режим (Concurrent Mode), позволяющий прерывать рендеринг и обрабатывать высокоприоритетные обновления (например, ввод пользователя) раньше фоновых обновлений данных.

Хуки: состояние и жизненный цикл в функциональных компонентах

До React 16.8 логика состояния и жизненного цикла была возможна только в классовых компонентах. Хуки решили эту проблему:

  • useState — добавляет локальное состояние в функциональный компонент. Возвращает пару: текущее значение и функцию-сеттер.
  • useEffect — позволяет выполнять побочные эффекты (запросы к API, подписки, таймеры) после рендеринга. Заменяет componentDidMount, componentDidUpdate и componentWillUnmount.
  • useContext — подписывает компонент на контекст React, позволяя передавать данные через дерево без prop drilling.
  • useReducer — управление сложным состоянием через функцию-редьюсер по паттерну Flux/Redux.
  • useMemo / useCallback — мемоизация вычислений и функций для предотвращения лишних рендеров.
  • useRef — хранение изменяемого значения без перерендера или прямой доступ к DOM-элементу.

Хуки можно комбинировать в пользовательские (custom hooks), инкапсулируя логику переиспользуемым способом.

Управление состоянием в React-приложениях

Для локального состояния достаточно useState и useReducer. Для состояния, общего между несколькими компонентами, используют Context API или внешние библиотеки:

  • Redux Toolkit — предсказуемый глобальный стор с иммутабельными обновлениями. Подходит для крупных приложений с сложной бизнес-логикой.
  • Zustand — лёгкая альтернатива Redux с минималистичным API.
  • Jotai / Recoil — атомарные подходы к состоянию, позволяющие подписываться только на нужные части данных.
  • React Query / TanStack Query — управление серверным состоянием: кэширование, фоновое обновление, оптимистичные обновления.

React и экосистема: маршрутизация, тестирование, стилизация

React не включает маршрутизатор — для этого используется React Router (или встроенные решения в Next.js). Для тестирования — React Testing Library в связке с Jest. Стилизация варьируется от обычного CSS и CSS-модулей до CSS-in-JS библиотек (styled-components, Emotion) и utility-first фреймворков (Tailwind CSS). Метафреймворки — Next.js, Remix, Gatsby — добавляют серверный рендеринг, маршрутизацию и оптимизацию поверх React.

React Native: мобильные приложения на React

React Native позволяет создавать нативные мобильные приложения для iOS и Android, используя те же концепции — компоненты, хуки, состояние — но вместо HTML-элементов рендерит нативные виджеты платформы. Это позволяет переиспользовать логику между веб и мобильными версиями, сохраняя нативную производительность интерфейса.

React 18 и актуальные возможности

React 18 принёс несколько важных изменений. Automatic Batching объединяет несколько вызовов setState в один рендер, даже внутри асинхронных функций и обработчиков событий браузера. Transitions (useTransition, startTransition) позволяют пометить обновление как некритичное, чтобы React мог прервать его в пользу более срочных операций. Suspense расширен для data fetching — компонент может «приостановиться», пока нужные данные не загрузятся, а React покажет fallback.

Когда React является оптимальным выбором

React хорошо подходит для сложных одностраничных приложений (SPA) с богатой интерактивностью, крупных команд с разделением на независимые компоненты, проектов, где нужна мобильная версия (React Native), и задач с частыми обновлениями UI в реальном времени. Для контент-ориентированных сайтов без сложной интерактивности альтернативы вроде Astro или Hugo могут быть проще. Для приложений, где критичен SEO и первичная загрузка, рекомендуется использовать React через Next.js с серверным рендерингом.

Частые вопросы

  • Чем React отличается от Angular и Vue?

    React — это библиотека только для слоя представления; Angular — полноценный фреймворк с DI, формами, роутером и HTTP-клиентом из коробки; Vue — прогрессивный фреймворк, занимающий промежуточное положение. React даёт максимальную гибкость в выборе остальных инструментов, Angular — максимальную структуру «из коробки», Vue — мягкий порог входа и хорошую документацию.

  • Что такое JSX и обязателен ли он?

    JSX — синтаксическое расширение JavaScript, позволяющее писать разметку внутри JS-кода. Компилятор (Babel или SWC) преобразует JSX в вызовы React.createElement. JSX не обязателен — React можно использовать и без него, вызывая createElement напрямую, но на практике JSX используется повсеместно благодаря читаемости.

  • Что такое React Server Components?

    React Server Components (RSC) — компоненты, которые рендерятся исключительно на сервере и не включаются в JavaScript-бандл. Они могут напрямую читать базы данных и файлы, не раскрывая логику клиенту. RSC доступны через Next.js App Router начиная с версии 13 и значительно уменьшают размер клиентского JS.

Не хватает деталей?

Напишите, что уточнить по теме «react» — это помогает улучшать материал и подсказывает, какие термины добавить дальше. Email необязателен: укажите, если хотите ответ только для вас (мы не шлём рассылки).

Поделиться