Практическая лаборатория 5 из 5 (последняя)

Angular vs React — одна задача, две философии

Сначала опишите поведение словами. Затем посмотрите, как каждая идея переводится на конкретный фреймворк.

В этой лаборатории мы не учим «с нуля» программировать на Angular или React. Мы берём одну и ту же задачу — список задач (TaskFlow) — и решаем её двумя способами, чтобы вы почувствовали разницу.

Что вы узнаете

Шаг 0. Что такое фреймворк и библиотека

Прежде чем сравнивать два инструмента, разберёмся с главными словами. Это основа всей лабораторной.

Аналогия — фреймворк. Представьте конструктор Lego с инструкцией. Коробка говорит: «сначала собери каркас, потом вставь колёса, потом — крышу». Вы не решаете, в каком порядке собирать, — инструкция управляет вами. Так работает Angular: он задаёт структуру всего приложения, а вы заполняете детали.
Аналогия — библиотека. Представьте ящик с отдельными инструментами (молоток, отвёртка, пила). Вы сами решаете: «сейчас мне нужен молоток», берёте его, делаете дело и кладёте обратно. Никто не диктует порядок. Так работает React: это набор готовых «кирпичиков» для интерфейса, а собирать из них программу вы будете сами.

Суть одним предложением: фреймворк сам вызывает ваш код (он «главный»), а библиотеку вызываете вы (главный — вы).

Таблица «Похоже / Отличается»

ПохожеОтличается
И то, и другое — чужой код, который вы подключаете к проекту, чтобы не писать всё с нуля. Фреймворк (Angular) навязывает структуру: «делай так, иначе не заработает».
Библиотека (React) не навязывает структуру: берёте только то, что нужно.
На обоих можно построить один и тот же внешне интерфейс (тот же список задач). Фреймворк даёт «всё включено»: роутинг, формы, запросы к серверу уже внутри.
Библиотека даёт только интерфейс; роутинг и запросы берутся из других пакетов.
Оба помогают разбить экран на компоненты (детали конструктора). Фреймворк требует писать компонент как класс с декоратором.
Библиотека позволяет писать компонент как обычную функцию.
💡 Запомните образ: Angular — это «конструктор с инструкцией» (инструкция диктует порядок сборки, вы заполняете детали). React — это «набор отдельных инструментов» (вы сами решаете, что брать и в каком порядке).

Шаг 1. Опишите поведение словами

Прежде чем писать код, запишите шаги на человеческом языке:

Аналогия. Эти шаги — как рецепт приготовления блюда. Сначала достали продукты, потом нарезали, потом пожарили, потом подали. Порядок один и тот же, неважно, готовите вы на плите или в микроволновке. Так же и здесь: шаги одинаковые, а «кухня» (Angular или React) разная.
  1. Получить данные: компонент запрашивает список задач. Данные приходят асинхронно (не мгновенно, а чуть позже).
  2. Передать данные в UI: массив задач передаётся в шаблон.
  3. Отобразить: для каждой задачи — title и статус completed (выполнена или нет).
  4. Обработать клик: пользователь кликает по задаче.
  5. Изменить состояние: completed = !completed (было «нет» — стало «да»).
  6. Обновить UI: фреймворк перерисовывает экран с учётом изменений.
Подсказка. Эти 6 шагов — одна и та же логика для обоих фреймворков. Разница только в механизмах (какими командами мы это пишем).

Шаг 2. Таблица соответствий

Посмотрите, как один и тот же шаг из «рецепта» выше называется в каждом инструменте.

ШагAngularReact
Получить данныеСервис + HttpClient + Observablefetch / Axios + useEffect
Передать данные@Input() или signalsprops
Событие (клик)(click)="handler()"onClick={handler}
Изменить состояниеsignal() / BehaviorSubjectuseState / useReducer
Отобразить список@for (task of tasks()) { ... }{tasks.map(t => ...)}
Обновить UIАвтоматическиАвтоматически
Ключевое: колонки «Angular» и «React» решают одни и те же 6 шагов, просто разными словами. Дальше мы увидим это в живом коде.

Шаг 3. Реализация

Одна и та же задача — список задач с отметкой «выполнено». Решаем её дважды.

Angular (signals)

Контекст. Это компонент списка задач в приложении TaskFlow. Он хранит массив задач в «сигнале» и по клику переключает флаг completed у нужной задачи.

Аналогия — signal (сигнал). Представьте группу в мессенджере. Как только значение сигнала меняется, все «подписчики» (в том числе экран) получают уведомление и обновляются. Вам не нужно вручную говорить «перерисуй кнопку» — сигнал сделает это сам.
import { Component, signal } from '@angular/core';

@Component({
  // selector — имя, под которым компонент вставляется в HTML
  selector: 'app-task-list',
  template: `
    @for (task of tasks(); track task.id) {
      <li [class.completed]="task.completed">
        {{ task.title }}
        <button (click)="toggle(task.id)">
          {{ task.completed ? 'Done' : 'Todo' }}
        </button>
      </li>
    }
  `
})
export class TaskListComponent {
  // signal — реактивное значение: при изменении UI сам перерисовывается
  tasks = signal([]);

  toggle(id) {
    // .update меняет значение сигнала; для каждой задачи берём копию
    // и у найденной по id инвертируем флаг completed (да/нет)
    this.tasks.update(list =>
      list.map(t =>
        t.id === id ? {...t, completed: !t.completed} : t
      )
    );
  }
}

Пошаговый разбор:

  1. Создаём компонент TaskListComponent с шаблоном.
  2. В шаблоне @for перебирает задачи из сигнала tasks() (скобки — это «прочитать значение сигнала»).
  3. Для каждой задачи рисуем <li> с кнопкой; класс completed добавляется, если задача выполнена.
  4. По клику вызывается toggle(id).
  5. .update заменяет массив: у задачи с нужным id флаг completed меняется на противоположный.
  6. Сигнал «уведомляет» шаблон — экран перерисовывается автоматически.
Что увидит студент: на экране список задач. Нажимаешь кнопку у задачи — она помечается выполненной (меняется вид/текст кнопки), и список тут же обновляется.
React (hooks)

Контекст. Тот же компонент списка задач для TaskFlow, но написан на React. Задачи хранятся в «состоянии» через useState, а загрузка данных — в useEffect.

Аналогия — state (состояние). Представьте статус заказа в магазине: «в обработке / готов / ошибка». Пока статус не поменялся — экран показывает старое. Как только вы вызвали функцию обновления состояния — React перерисовывает компонент с новым статусом.
import { useState, useEffect } from 'react';

export default function TaskList() {
  // useState возвращает пару: [значение, функция_обновления]
  const [tasks, setTasks] = useState([]);

  // useEffect запускается один раз при показе компонента (пустой [])
  useEffect(() => {
    fetchTasks().then(data => setTasks(data));
  }, []);

  // toggle меняет состояние: инвертирует completed у задачи по id
  const toggle = (id) => {
    setTasks(list =>
      list.map(t =>
        t.id === id ? {...t, completed: !t.completed} : t
      )
    );
  };

  return (
    <ul>
      {tasks.map(t => (
        <li key={t.id}>
          {t.title}
          <button onClick={() => toggle(t.id)}>
            {t.completed ? 'Done' : 'Todo'}
          </button>
        </li>
      ))}
    </ul>
  );
}

Пошаговый разбор:

  1. Через useState([]) создаём состояние tasks и функцию setTasks.
  2. useEffect с пустым массивом [] запускается один раз и загружает задачи.
  3. В return пишем JSX — это HTML внутри JavaScript (обратите внимание: class здесь className).
  4. tasks.map(...) превращает каждую задачу в <li> с кнопкой.
  5. По клику onClick вызывается toggle(t.id).
  6. setTasks создаёт новый массив с инвертированным флагом completed у нужной задачи.
  7. React видит новое состояние и перерисовывает список автоматически.
Что увидит студент: точно такой же список задач, как в Angular-варианте. Нажатие на кнопку переключает статус задачи, и текст/вид обновляются мгновенно.
💡 Сравните два блока. Шаги (1→6) совпадают слово в слово. Разница лишь в «словарях»: signal() vs useState, @for vs .map, (click) vs onClick. Поняв шаги один раз, вы легко перенесёте их на любой инструмент.

Шаг 4. Философия

Теперь — «крупным планом», чем инструменты отличаются по духу.

КритерийAngularReact
ПодходКлассы + декораторы + шаблоныФункции + хуки + JSX
СостояниеSignals / RxJSuseState / useContext
Роутинг, формы, HTTPВстроены в фреймворкВнешние библиотеки
Когда выбиратьEnterprise, команды, нужна строгостьСтартапы, гибкость, быстрые итерации

Таблица «Похоже / Отличается» (философия)

ПохожеОтличается
Оба перерисовывают экран автоматически при изменении данных. Angular «знает», КАК перерисовать, через свою систему (signals/RxJS). React перерисовывает, сравнивая новое состояние со старым.
В обоих компонент — это переиспользуемая деталь интерфейса. Angular — компонент это класс + отдельный HTML-шаблон. React — компонент это функция, внутри которой сразу пишется JSX (HTML в JS).
Оба — JavaScript-экосистема, оба бесплатны и популярны. Angular — «конструктор с инструкцией» (фреймворк). React — «набор отдельных инструментов» (библиотека), остальное докупаете сами.

Интерактивная песочница

▶️ Сравните: Angular-стиль vs React-стиль (псевдокод, который рисует две карточки рядом):

Песочница: нажми «Запустить» — и увидишь две карточки бок о бок: слева «Angular-стиль» (красная), справа «React-стиль» (зелёная) с псевдокодом компонента. Меняй код и запускай снова.
Песочница: Angular vs React
Что увидит студент: две карточки бок о бок — слева «Angular-стиль» (красная), справа «React-стиль» (зелёная). Внутри — псевдокод компонента. Вывод под ними: «Оба делают одно и то же: отображают задачу».

Выводы

Что запомнить

  • Одна задача — два решения. И Angular, и React делают одно и то же, но разными механизмами.
  • Архитектура важнее синтаксиса. Если вы поняли шаги (получить → отобразить → обработать → изменить → обновить), вы сможете реализовать это на любом фреймворке.
  • Angular — фреймворк. Всё включено: роутер, формы, HTTP, DI. Как конструктор с инструкцией.
  • React — библиотека. Только UI. Остальное — из экосистемы. Как ящик с инструментами.
  • Переход между фреймворками — это не изучение нового языка, а понимание, как ваша архитектура маппится на конкретный инструмент.
✍️ Дома попробуйте: откройте Angular_React_Urok_01.html и, глядя на таблицу шага 2, опишите вслух, как бы вы реализовали список задач. Не код — просто словами по 6 шагам.

Лаборатория 5 из 5 (последняя). ← Лаборатория 4 | Вернуться к уроку 1

Куда дальше: углубись в Angular — Урок 1 и Урок 5 (сигналы); для сравнения подходов — практика к уроку 5.

📖 Глоссарий

ТерминЖизненная аналогияКоротко
ФреймворкКонструктор Lego с инструкциейЗадаёт структуру приложения и порядок сборки, вы заполняете детали (Angular).
БиблиотекаЯщик с отдельными инструментамиНабор готовых «кирпичиков», вы сами решаете, что брать и в каком порядке (React).
КомпонентДеталь конструктораПереиспользуемая запчасть интерфейса, из которых собирается экран.
Сигнал (signal)Группа в мессенджереЗначение с «подписчиками»: при изменении все получают уведомление и обновляются.
Состояние (state)Статус заказа в магазинеТекущее положение дел: «в обработке / готов / ошибка»; смена перерисовывает экран.
JSX / шаблонЧертёж детали конструктораОписание того, как компонент выглядит: HTML внутри JS (React) или отдельный шаблон (Angular).

🧠 Самопроверка

1. Фреймворк — это «набор отдельных инструментов», который вы берёте по мере надобности. Верно или неверно?

2. Сигнал похож на «группу в мессенджере» и сам уведомляет экран об изменениях. Верно или неверно?

3. Angular и React используют одинаковые механизмы, просто разные названия? Верно или неверно?

Прогресс курса