TGViewer
Frontend Советы Frontend Советы @frontend_sovet · 2.04K subscribers
Post #424 407
⚛️ Прощай, e.preventDefault(): Нативные формы в React

Управление формами в React всегда требовало кучи бойлерплейта: отдельные useState для данных, лоадеров и ошибок, ручной try/catch и обязательный e.preventDefault().

В React 19 появились Actions и новые хуки, которые забирают эту рутину на себя, используя нативные возможности браузера.

1. useActionState (Стейт формы)
Позволяет привязать асинхронную функцию к форме и автоматически сохранять результат её выполнения (например, сообщения об ошибках).

2. useFormStatus (Контекст лоадера)
Позволяет дочерним элементам читать статус родительской формы (загрузка, отправленные данные). Больше не нужно прокидывать пропс isLoading сквозь всё дерево компонентов.

🚀 Как это выглядит на практике:


import { useActionState, useFormStatus } from "react";

// 1. Асинхронный экшен (может быть и Server Action)
async function createUserAction(prevState, formData) {
const name = formData.get("name");

if (!name) return { error: "Имя обязательно!" };

await fetch("/api/users", { method: "POST", body: name });
return { success: true, message: "Пользователь создан!" };
}

// 2. Изолированная кнопка, которая "знает" о статусе загрузки
function SubmitButton() {
const { pending } = useFormStatus();
return (
<button disabled={pending}>
{pending ? "Сохраняем..." : "Создать"}
</button>
);
}

// 3. Сама форма
export function UserForm() {
const [state, formAction] = useActionState(createUserAction, null);

return (
// Просто передаем action в форму! Никаких onSubmit.
<form action={formAction}>
<input name="name" placeholder="Введите имя" />

{state?.error && <p className="error">{state.error}</p>}
{state?.success && <p className="success">{state.message}</p>}

<SubmitButton />
</form>
);
}


🧠 Senior-нюансы:
• Где вызывать useFormStatus? Он работает под капотом как Context API. Поэтому его нужно вызывать только в дочерних компонентах внутри <form>. Если вызвать его в компоненте UserForm из примера выше, pending всегда будет false.

• Progressive Enhancement: Если вы используете фреймворк с SSR (например, Next.js), такая форма может отправить данные даже если JavaScript на клиенте еще не загрузился или вовсе отключен.

👉@frontend_sovet
  • 👍 1
More from @frontend_sovet
  1. Jun 14, 2026Совет по CSS 💡 Знаете ли вы о свойстве shape-outside в CSS? Demo https://www.codewithshri…
  2. Apr 18, 2026🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.r…
  3. Mar 21, 2026🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.r…
  4. Mar 19, 2026CSS совет 💡 Проявите креативность с текстом всего с 3 строками CSS-кода ✨ 👉@frontend_sov…
  5. Jan 13, 2026⚛️ Как я перестал бояться useEffect и упростил код Сегодня разберём проблему, которую я по…
  6. Dec 16, 2025🎨 CSS Tip: Как скрыть контент визуально, но оставить его доступным В погоне за минималист…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →