1. Основы React: JSX, Виртуальный DOM и ключевые отличия от шаблонов Angular
Основы React: JSX, Виртуальный DOM и ключевые отличия от шаблонов Angular
Добро пожаловать в мир React! Как разработчик Angular, вы уже обладаете мощным фундаментом: вы понимаете, что такое компоненты, состояние приложения и жизненный цикл. Однако React предлагает иной взгляд на построение пользовательских интерфейсов. Если Angular — это полноценный фреймворк «все включено» с четкими правилами и структурой, то React — это библиотека, которая дает вам свободу (и ответственность) собирать приложение из кирпичиков JavaScript.
В этой статье мы разберем три фундаментальных столпа React, которые чаще всего вызывают вопросы у Angular-разработчиков: синтаксис JSX, концепцию Виртуального DOM и смену парадигмы с двустороннего связывания на однонаправленный поток данных.
1. JSX: Это не просто HTML в JavaScript
Первое, что бросается в глаза при взгляде на код React — это странная смесь HTML-тегов прямо внутри JavaScript-кода. Это называется JSX (JavaScript XML).
В Angular мы привыкли к разделению ответственности: логика живет в файле .ts, а разметка — в файле .html. Angular парсит ваши шаблоны и превращает их в инструкции JavaScript во время компиляции.
В React философия другая: разметка и логика неразрывно связаны, поэтому они живут вместе внутри компонента. React считает, что логика рендеринга (как отобразить список, что показать при условии true) — это тоже часть UI-логики.
Как это работает под капотом?
Браузеры не понимают JSX. Перед тем как код попадет в браузер, транспилятор (например, Babel) превращает JSX в обычные вызовы функций JavaScript.
Взгляните на этот пример:
Поскольку JSX — это JavaScript, вы можете использовать всю мощь языка прямо внутри разметки. Вам не нужно учить специальный синтаксис шаблонов (как ngIf или ngFor), вы просто используете операторы JavaScript.
!Визуализация процесса транспиляции JSX в нативный JavaScript
2. От шаблонов Angular к логике React
Давайте сравним, как решаются типовые задачи в Angular и React. Это поможет вам быстрее переключить контекст.
Условный рендеринг
В Angular мы используем структурную директиву *ngIf:
В React мы используем обычные операторы JavaScript, такие как тернарный оператор или логическое И (&&):
Обратите внимание на фигурные скобки {}. В JSX они означают: «здесь начинается зона JavaScript». Все, что внутри скобок, будет вычислено.
Списки и циклы
В Angular есть *ngFor:
В React мы используем метод массива .map(), который возвращает новый массив элементов:
> Важное замечание: атрибут key в React обязателен при рендеринге списков. Он помогает React определять, какие элементы были изменены, добавлены или удалены. Это аналог trackBy в Angular, но используется по умолчанию.
Таблица сравнения синтаксиса
| Концепция | Angular (Шаблон) | React (JSX) |
| :--- | :--- | :--- |
| Интерполяция | {{ value }} | {value} |
| Привязка атрибута | [src]="url" | src={url} |
| Слушатель событий | (click)="handler()" | onClick={handler} |
| Классы стилей | [class.active]="isActive" | className={isActive ? 'active' : ''} |
| Циклы | *ngFor | .map() |
| Условия | *ngIf | && или ? : |
3. Виртуальный DOM (Virtual DOM)
В Angular механизм обнаружения изменений (Change Detection) опирается на Zone.js, который перехватывает асинхронные события и проверяет дерево компонентов на изменения. Это мощный, но иногда тяжеловесный механизм.
React использует концепцию Виртуального DOM. Это легковесная копия реального DOM, хранящаяся в памяти в виде обычных JavaScript-объектов.
Процесс согласования (Reconciliation)
Когда состояние компонента меняется (например, вы вызвали setState или изменились пропсы), происходит следующее:
!Схема работы алгоритма согласования (Reconciliation) и обновления DOM
Почему это важно? Работа с реальным DOM — это самая медленная операция в браузере. Чтение и запись в DOM вызывают пересчет макета (reflow) и перерисовку (repaint). Виртуальный DOM позволяет минимизировать эти обращения, группируя обновления.
4. Однонаправленный поток данных
Angular известен своим двусторонним связыванием данных (Two-Way Data Binding), которое часто реализуется через [(ngModel)]. Это удобно для форм: изменили инпут — обновилась модель, изменили модель — обновился инпут.
React строго придерживается однонаправленного потока данных (One-Way Data Flow).
* Данные текут вниз: Родитель передает данные ребенку через свойства (props). * События всплывают вверх: Ребенок не может изменить пропсы. Если нужно изменить данные, ребенок вызывает функцию-колбэк, переданную родителем, и родитель меняет свое состояние.
Пример отличия
Представьте поле ввода имени.
В Angular:
Вы пишете <input [(ngModel)]="name">. Angular сам следит за синхронизацией.
В React: Вы должны явно контролировать процесс:
name» (value={name}).setName с новым значением» (onChange=...).Это может показаться более многословным, но это делает поток данных предсказуемым. Вы всегда точно знаете, откуда пришли данные и что вызвало их изменение. В больших приложениях это значительно упрощает отладку.
Заключение
Переход с Angular на React требует смены ментальной модели. Вам больше не нужно запоминать сложные директивы шаблонов — вместо этого вы используете свои знания JavaScript. Виртуальный DOM берет на себя оптимизацию производительности, а однонаправленный поток данных делает поведение приложения предсказуемым.
В следующей статье мы углубимся в сердце React-приложения — Компоненты и Пропсы, и научимся создавать переиспользуемые элементы интерфейса.