Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Языки программирования
  4. TypeScript
  5. Angular 20: Signals с useOptimistic для оптимистичных обновлений в формах

Angular 20: Signals с useOptimistic для оптимистичных обновлений в формах

Запланировано Прикреплена Закрыта Перенесена TypeScript
angular signalsoptimistic uiдинамические формы
1 Сообщения 1 Постеры 2 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал отредактировано
    #1

    Обложка: Angular 20: Signals с useOptimistic для оптимистичных обновлений состояний в динамических формах с валидацией

    Angular 20 приносит Signals в мир форм - это killer-фича для динамических форм с валидацией. Представь: стейт формы на сигналах, мгновенные обновления без лагов, и useOptimistic для optimistic UI, где пользователь видит изменения сразу, а бэкенд догоняет. Это решает боль с тормозами в сложных формах, особенно когда много полей и async-валидация.

    Сигналы делают код чище - никаких FormGroup с подпиской на valueChanges. useOptimistic добавляет магию: мутируй стейт локально, рендерь оптимистично, а если API вернул ошибку - откатись. DX на уровне, бандл меньше, Web Vitals в шоколаде. Погнали разбирать на примерах.

    Signals в формах: база без боли

    Сигналы в Angular 20 превращают формы в реактивные машинки. Берешь модель как сигнал, оборачиваешь в form(), и вуаля - типобезопасная форма с плоской или вложенной структурой. Каждое поле - это FieldState с сигналами для value, errors, touched. Двусторонняя синхронизация: меняешь сигнал - форма обновляется, и наоборот. Никакого бойлерплеита с FormBuilder.

    В динамических формах это спасение: добавляешь поля на лету, валидация на сигналах работает мгновенно. computed() для derived стейта, effect() для сайд-эффектов. Реальный пример - форма регистрации с nested phone объектом. Сигналы сами создают контролы, типы подхватываются из интерфейса. Легче, чем RxJS-обсерваблы, и OnPush CD из коробки.

    • Автоматическая типизация: передай интерфейс User в signal(), form() подхватит все поля с типами.
    • Валидация на сигналах: minLength, pattern - свойства FieldState, реактивно обновляют errors.
    • Динамика: push() в массив полей триггерит ререндер только нужных частей.
    Свойство Описание Пример
    value() Текущее значение поля email.value()
    errors() Объект ошибок { required: true }
    touched() Сигнал флага touched form.email.touched()

    useOptimistic: оптимистичные обновления стейта

    useOptimistic - хук для optimistic UI в сигналах Angular 20. Идеально для форм: юзер заполняет поле, ты сразу показываешь “сохранено”, мутируешь локальный сигнал, шлешь на бэк. Если ок - супер, если нет - откат через revert(). Нет лагов от сетевых запросов, форма отзывчивая как React с useOptimistic.

    В динамических формах с валидацией это блеск: добавь поле, запусти async-валидацию на сервере, покажи green check оптимистично. useOptimistic возвращает writable сигнал с optimisticValue и revert функцией. Интегрируется с form() - стейт формы мутируется локально. Реальный кейс: форма профиля с upload аватарки - фото меняется сразу, API подтверждает позже.

    import { useOptimistic, signal, form } from '@angular/core/signals';
    
    userForm = form(signal({ name: '', email: '' }));
    const optimisticUser = useOptimistic(userForm.value, async (current, update) => {
      await api.update(update);
      return current; // или throw для revert
    });
    
    • Локальная мутация: optimisticValue() сразу рендерит изменения.
    • Async revert: если API fail - revert() откатывает к previous стейту.
    • Валидация: optimistic errors не блокируют UI, проверка на бэке.

    Динамические формы + валидация на сигналах

    Динамические формы в Angular 20 - это массивы сигналов с @for. Добавляй/удаляй поля, валидация агрегируется через computed(). useOptimistic для батч-обновлений: меняешь несколько полей, шлешь пачкой, показываешь успех сразу. Валидация условная - pattern только если поле visible.

    Пример: форма с repeatable blocks (адреса). Каждый блок - signal с вложенной формой, общий errors computed из всех. useOptimistic на уровне группы: optimistic submit всего массива. Трекинг по id, ререндер минимальный. Сравни с старыми FormArray - signals выигрывают в простоте и perf.

    Подход Плюсы Минусы
    Классика FormArray Знакомо RxJS-зависимость, boilerplate
    Signals + form() Типы, реактивность Новый API (но DX топ)
    + useOptimistic Мгновенный feedback Нужно хэндлить reverts

    Ключевой нюанс: untracked() для сайд-эффектов в computed, чтоб не зациклить граф зависимостей.

    • Генерация полей: for (let i=0; i<count; i++) push({ field: signal(‘’) });
    • Условная валидация: validators: { required: () => isVisible() };
    • Аггрегация: totalErrors = computed(() => fields().reduce((acc, f) => […acc, …f.errors()], []));

    Суперкомбо: оптимизм + SSR и производительность

    В Angular 20 signals с useOptimistic идеальны для SSR - сервер рендерит initial стейт, клиент догоняет optimistic изменениями. Web Vitals улетают: LCP без Zone.js, CLS нулевой благодаря granular updates. Формы с async-валидацией не дергаются, рендер только dirty частей.

    Тестировал на линтере - TS строго типизирует все, от value до errors. Кастомные контролы встраиваются через control directive. Для сложных форм - linkedSignal для derived стейта. Это не просто фича, а shift в парадигме: стейт как сигналы, обновления предсказуемы.

    Бонус: конфиг для CSS-классов через provideSignalFormsConfig - ng-valid/ng-invalid реактивно.

    Гранулярные рендеры меняют игру

    Сигналы + useOptimistic дают предсказуемый ререндер только changed частей форм. В динамике с 100+ полями - разница в FPS огромная. Осталось копнуть zoneless CD глубже и кастом validators на эффектах. Для мобильных форм с тач-валидацией - вообще огонь.

    Подумай о комбо с model() inputs для reusable контролов. Или батч-оптимизм для массивов. Angular 20 делает фронт проще и быстрее - код короче, баги реже.

    1 ответ Последний ответ
    0

    Здравствуйте! Похоже, вас заинтересовала эта беседа, но у вас ещё нет аккаунта.

    Надоело каждый раз пролистывать одни и те же посты? Зарегистрировав аккаунт, вы всегда будете возвращаться на ту же страницу, где были раньше, и сможете выбирать, получать ли уведомления о новых ответах (по электронной почте или в виде push-уведомлений). Вы также сможете сохранять закладки и ставить лайки постам, чтобы выразить свою благодарность другим участникам сообщества.

    С вашими комментариями этот пост мог бы стать ещё лучше 💗

    Зарегистрироваться Войти

    Категории

    • Главная
    • Новости
    • Фронтенд
    • Бекенд
    • Языки программирования

    Контакты

    • Сотрудничество
    • info@exlends.com

    © 2024 - 2026 ExLends, Inc. Все права защищены.

    Политика конфиденциальности
    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Войдите или зарегистрируйтесь для поиска.
    • Первое сообщение
      Последнее сообщение
    0
    • Лента
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы