React Hook Form + Zod w Next.js — walidacja formularzy z Server Actions
Jak zbudować formularz w Next.js z React Hook Form, Zod i Server Actions? Jeden schemat walidacji, błędy client/server, typowanie i progressive enhancement.
React Hook Form — wydajne formularze (minimalne re-rendery), wbudowany error management, integracja z UI bibliotekami. Zod — walidacja z type inference (jeden schemat → typ TypeScript). Server Actions — mutacje na serwerze bez API endpoints.
Ten wpis jest praktyczną implementacją formularza na konkretnym stacku. Jeśli chcesz najpierw zrozumieć same Server Actions i ich trade-offy, zacznij od Server Actions — formularze bez endpointów API.
Razem: walidacja na kliencie (natychmiastowy feedback) + walidacja na serwerze (bezpieczeństwo) + jeden schemat Zod (DRY).
1. Użytkownik wypełnia formularz
2. React Hook Form + zodResolver waliduje na kliencie (natychmiastowy feedback)
3. Po poprawnej walidacji → handleSubmit wywołuje onSubmit
4. onSubmit wywołuje Server Action z typowanymi danymi
5. Server Action waliduje ponownie Zod (bezpieczeństwo)
6. Jeśli OK → wysyła email, zwraca { success: true }
7. Jeśli błąd serwerowy → zwraca errors → setError mapuje na pola RHF
Dwie warstwy walidacji: klient (UX — natychmiastowy feedback), serwer (bezpieczeństwo — nie ufaj klientowi). Jeden schemat Zod obsługuje oba.
Podsumowanie
React Hook Form + Zod + Server Actions to najlepszy stack do formularzy w Next.js App Router. Jeden schemat Zod = jedno źródło prawdy dla walidacji, typów i error messages. RHF daje wydajne formularze z minimalnym re-renderem. Server Actions eliminują potrzebę API endpoints.
Kluczowe: zawsze waliduj na serwerze (Server Action), nawet gdy klient waliduje. Mapuj błędy serwerowe na pola RHF przez setError. I pamiętaj o noValidate na <form> — żeby przeglądarka nie wyświetlała własnych tooltipów walidacyjnych.
Najczęściej zadawane pytania
Czy mogę użyć Server Actions bez React Hook Form?
Tak — useActionState + natywne FormData wystarczą dla prostych formularzy (3–5 pól). RHF dodaje wartość przy złożonych formularzach: dynamiczne pola, wielokrokowe, walidacja per-keystroke.
Jak obsłużyć file upload w RHF + Server Actions?
RHF obsługuje <input type="file"> z register('file'). W Server Action odbierasz plik jako FormData.get('file'). Ale lepiej: użyj Uploadthing z dedykowanym komponentem uploadu, a w formularzu przekaż URL przesłanego pliku.
Czy zodResolver spowalnia formularz?
Nie zauważalnie — Zod waliduje schemat w < 1 ms. RHF domyślnie waliduje onSubmit; dla per-keystroke dodaj mode: 'onChange' w useForm (lekko cięższe, ale nadal szybkie).
Pracuję z tym zawodowo.
Jeśli chcesz przełożyć ten temat na lepszą architekturę frontendu, uporządkować React lub Next.js i podnieść jakość pracy zespołu, skontaktuj się ze mną. Pomagam zamieniać wiedzę z artykułów w praktyczne decyzje technologiczne.
Maciej Sala — project manager i frontendowiec z doświadczeniem w marketingu internetowym. Na co dzień pracuję z Reactem, Next.js i TypeScriptem, łącząc perspektywę produktową z praktycznym podejściem do kodu. Przez kilka lat związany z branżą gier wideo jako project manager i game designer.
Absolwent historii na Uniwersytecie Jagiellońskim i studiów podyplomowych z marketingu internetowego na Akademii Górniczo-Hutniczej w Krakowie. Poza pracą trenuje na siłowni, maluje figurki i realizuje własne projekty.
Anthropic uderza w Figmę i Adobe — oto Claude Design
Anthropic wypuścił właśnie narzędzie AI do tworzenia stron, landing page'ów i prezentacji z promptu. Oto co wiemy o Claude Design i Opus 4.7 — i co to oznacza dla developerów.
Astro.js vs Next.js — które narzędzie wybrać w 2026 roku?
Fachowe porównanie Astro.js i Next.js z perspektywy developera pracującego na co dzień w Next.js. Architektura, wydajność, SEO, DX, koszty i konkretne use case — z benchmarkami i przykładami kodu.
WordPress → Next.js — migracja treści, redirecty 301 i zachowanie pozycji SEO
Jak przenieść stronę z WordPress na Next.js bez utraty pozycji w Google? Eksport treści, mapowanie URL, redirecty 301, migracja obrazów i weryfikacja indeksacji.