Перейти к содержанию
  • Лента
  • Категории
  • Последние
  • Метки
  • Популярные
  • Пользователи
  • Группы
Свернуть
exlends
Категории
  1. Главная
  2. Категории
  3. Фронтенд
  4. React 19.1: Actions API + Zod для типобезопасных форм без лишнего стейта

React 19.1: Actions API + Zod для типобезопасных форм без лишнего стейта

Запланировано Прикреплена Закрыта Перенесена Фронтенд
react 19zodactions api
1 Сообщения 1 Постеры 4 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Ответить
  • Ответить, создав новую тему
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • hannadevH Не в сети
    hannadevH Не в сети
    hannadev
    написал отредактировано
    #1

    Обложка: React 19.1: Actions API с автоматической валидацией через Zod для типобезопасных форм без дополнительного state management

    React 19.1 приносит Actions API - это киллер-фича для форм, где валидация через Zod работает автоматически. Забудь про ручной стейт, useState для ошибок и танцы с бубном. Теперь формы типобезопасны из коробки, с серверными экшнами и валидацией на лету.

    Это решает боль с дублированием кода: один Zod-схема для клиента и сервера. Формы рендерятся быстрее, типы из схемы льются в TS автоматически. Идеально для Next.js или чистого React - меньше бойлерплейта, больше фокуса на логике.

    Actions API: что это и как оно меняет формы

    Actions API в React 19.1 - это хуки вроде useActionState, которые берут на себя весь стейт формы: pending, ошибки, результат. Подключи Zod-схему - и валидация автоматом работает на клиенте и сервере. Нет нужды в react-hook-form или другом либах для базовых кейсов - React сам справляется.

    Представь форму логина: юзер вводит email и пароль, жмет submit. ActionState ловит данные, валидирует через Zod, показывает ошибки под полями без лишнего кода. Если сервер вернул ошибку - она мержится с клиентской валидацией. Это чисто, типобезопасно и производительно - бандл не раздувается.

    Ключевые плюсы подхода:

    • Авто-рендер состояний: pending-спиннер, ошибки, успех - без useEffect.
    • Типы из Zod: infer прямо в TS, никаких any.
    • Синхронная валидация: клиент + сервер по одной схеме.
    • Меньше ререндеров: стейт внутри хука, не провоцирует лишние обновы.
    Старый подход Actions API + Zod
    useState + useEffect для ошибок useActionState управляет всем
    Дубли схем клиент/сервер Одна Zod-схема везде
    Ручная валидация onSubmit Авто на blur/change/submit
    Лишний стейт в компоненте Ноль глобального стейта

    Zod-схемы: типы и валидация в одном флаконе

    Zod - это TS-first либа для схем, где валидация и типы генерятся автоматически. Определи схему для формы - и получи типы через z.infer. В React 19.1 это интегрируется с Actions: схема парсит данные перед отправкой, кидает ошибки в ActionState.

    Пример схемы для user-формы: z.object({ email: z.string().email(), age: z.number().min(18) }). В action-функции safeParse проверяет данные, если fail - возвращает ошибки в формате { field: ‘error msg’ }. На клиенте resolver из @hookform/resolvers/zod (если юзаешь RHF) или нативно через form action.

    Плюс runtime-валидация: Zod ловит не только типы, но и бизнес-логику - minLength, regex, custom validators. Серверный action в Next.js получает те же данные, парсит схемой - дублирования ноль.

    • Базовая схема: const userSchema = z.object({ name: z.string().min(2), email: z.string().email() });
    • Infer типов: type User = z.infer<typeof userSchema>; - TS сам допишет.
    • Расширения: .refine() для кастомных чеков, .array() для списков.
    • Интеграция: zodResolver для RHF или прямой parse в action.
    const schema = z.object({
      email: z.string().email('Некорректный email'),
      password: z.string().min(8, 'Минимум 8 символов')
    });
    
    type FormData = z.infer<typeof schema>;
    

    Практика: форма без state management

    Соберем форму регистрации на Actions API. useActionState возвращает [state, action, isPending]. State - это ошибки или данные, action - функция для onSubmit. Zod парсит formData в action, возвращает результат.

    В шаблоне:

    с input’ами, ошибки из state.errors.field рендерятся под полями. На сервере action async-функция, safeParse + бизнес-логика. Клиентская валидация на blur через ZodResolver если с RHF, или нативно.

    Это убирает useState полностью - React держит стейт формы внутри. Производительность на высоте: optimistic updates, revalidation через router.refresh() в Next.js.

    Шаги реализации:

    1. Определи Zod-схему и типы.
    2. Создай server action: async function register(formData) { const parsed = schema.safeParse(formData); ... }
    3. В компоненте: const [state, formAction] = useActionState(register, null);
    Состояние Как рендерится
    pending из isPending
    error {state.errors.email} под input
    success Redirect или success msg
    'use client';
    import { useActionState } from 'react';
    
    const [state, submitAction, pending] = useActionState(registerAction, undefined);
    
    return (
      <form action={submitAction}>
        <input name="email" />
        {state?.errors?.email && <p>{state.errors.email}</p>}
        <button disabled={pending}>Register</button>
      </form>
    );
    

    Оптимизации и подводные камни

    Actions API быстрое, но есть нюансы. Форма клирнится после успеха - используй revalidatePath для персистентности. Zod ошибки на сервере мапь в ActionState формат: { errors: { field: msg } }. Для сложных форм комбинируй с RHF + zodResolver.

    Производительность: debounce на async validators, validate onBlur для UX. Типобезопасность полная - TS жалуется если схемы не совпадают. Тестируй safeParse вместо parse - не крашит app.

    • Сервер/клиент sync: Экспортируй схему в shared файл.
    • Async валидация: z.preprocess(async (val) => await check(val), z.string()).
    • Эдж-кейсы: file uploads через FormData, nested objects с .transform().

    Код чистый - жизнь легкая

    Actions API с Zod в React 19.1 - это когда формы пишутся за 20 строк вместо 100. Типы, валидация, стейт - все нативно, без либ. Осталось за кадром: кастомные хуки для reusable форм, интеграция с TanStack Query для мутаций.

    Подумать стоит над миграцией legacy-форм: постепенно роллаут через новые actions. Для монолитов Next.js - идеал, для CRA подключи remotion или аналог.

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

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

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

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

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

    Категории

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

    Контакты

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

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

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

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

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