useActionState и useFormStatus
Используйте useActionState для отслеживания состояния ожидания и ошибок, а useFormStatus — для отключения кнопок отправки во время выполнения запроса
«useActionState и useFormStatus» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.
Знакомство с useActionState
useActionState(action, initialState) — это хук React 19, который оборачивает серверное действие и отслеживает его состояние между отправками. Он принимает функцию действия и начальное значение состояния, а возвращает кортеж, с помощью которого можно управлять всем взаимодействием с формой.
Возвращаемый кортеж
Хук возвращает [state, formAction, isPending]. В state хранится последнее возвращенное действием значение: изначально это null или заданное Вами начальное значение. formAction — обернутое действие, которое нужно передать форме. Значение isPending равно true, пока действие выполняется на сервере.
Отслеживание состояния между отправками
При каждой отправке формы серверное действие выполняется, а его возвращаемое значение становится новым значением state. При первой отрисовке state равно initialState. Благодаря этому легко отображать разный интерфейс в зависимости от того, были ли предыдущие отправки и какие результаты они вернули.
Отображение встроенных ошибок проверки
Если серверное действие возвращает { errors: { email: 'Invalid email' } }, Вы можете отобразить ошибку непосредственно в интерфейсе: {state.errors?.email && <p>{state.errors.email}</p>}. Поскольку состояние сохраняется между повторными отрисовками, сообщение об ошибке остается видимым, пока следующая успешная отправка не заменит это состояние.
Отображение сообщений об успехе
Когда действие возвращает { success: true }, компонент может отобразить сообщение об успехе: {state?.success && <p>Form submitted!</p>}. В зависимости от значения состояния форму можно условно скрыть или заменить сообщением об успехе.
Знакомство с useFormStatus
useFormStatus() — это хук, который считывает состояние ожидания ближайшего родительского элемента <form>. Он возвращает объект, включающий { pending: boolean }. Этот хук необходимо использовать внутри компонента, являющегося дочерним элементом формы, а не в компоненте, который сам отображает форму.
Почему существует ограничение расположения
Ограничение, согласно которому useFormStatus нужно использовать внутри формы, существует потому, что хук считывает контекст формы из расположенного выше дерева React. Если вызвать его в том же компоненте, который отображает форму, он будет соседним элементом формы, а не ее потомком, и не получит доступ к состоянию формы.
Создание компонента кнопки SubmitButton
Стандартный подход заключается в том, чтобы вынести кнопку отправки в отдельный компонент: function SubmitButton() { const { pending } = useFormStatus(); return <button disabled={pending}>Submit</button>; }. Затем этот компонент размещается внутри формы и получает доступ к состоянию ожидания формы.
Отключение кнопки отправки
Установка disabled={pending} на кнопке отправки предотвращает повторную отправку. Когда пользователь нажимает кнопку отправки и серверное действие выполняется, значение pending равно true, поэтому кнопка отключается и становится недоступной для нажатия. После завершения действия значение pending снова становится равным false, и кнопка включается.
Объединение обоих хуков
Полный подход к взаимодействию с формой объединяет оба хука: useActionState в компоненте формы отслеживает результат действия и предоставляет formAction, а useFormStatus внутри дочернего компонента SubmitButton отслеживает состояние ожидания. Вместе они обеспечивают отображение ошибок проверки и отзывчивую кнопку отправки.
Оптимистичный интерфейс с useOptimistic
Для еще более отзывчивого интерфейса useOptimistic используется вместе с useActionState. Вы сразу обновляете интерфейс ожидаемым результатом до ответа сервера, а затем синхронизируете его после получения фактического ответа. Этот подход часто используется в кнопках отметки «нравится», списках задач и других сценариях, требующих быстрой обратной связи.
Расположение useFormStatus
Где нужно вызывать useFormStatus, чтобы он работал правильно?
Повторение урока
useActionState(action, initialState) возвращает [state, formAction, isPending] для отслеживания результатов серверного действия. В состоянии хранится возвращаемое действием значение, благодаря чему можно отображать встроенные ошибки и сообщения об успехе. useFormStatus() предоставляет значение { pending } внутри дочерних компонентов формы, позволяя создавать отзывчивые кнопки отправки. Вместе оба хука обеспечивают полноценное и доступное взаимодействие с формой.
Часто задаваемые вопросы
Урок «useActionState и useFormStatus» бесплатный?
Да — полный текст урока «useActionState и useFormStatus» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.
Чему я научусь в уроке «useActionState и useFormStatus»?
Используйте useActionState для отслеживания состояния ожидания и ошибок, а useFormStatus — для отключения кнопок отправки во время выполнения запроса Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать React Academy?
Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «useActionState и useFormStatus»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке React Academy?
Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Серверные действия в React 19 и Next.js
- Действия форм: замена маршрутов API для мутаций
- useActionState и useFormStatus
- Прогрессивное улучшение с серверными действиями