Files
2026-03-17 23:53:10 +01:00

39 lines
2.2 KiB
TeX

\section{Űrlapkezelés}
\begin{frame}{Kontrollált és nem kontrollált input}
\begin{block}{Kontrollált input}
Az input mező értékét a React állapot tárolja és vezérli. A \texttt{value} prop és az \texttt{onChange} esemény mindig szinkronban tartja a React állapotot és a mezőt --- bármikor pontosan tudjuk, mi van a mezőben.
\end{block}
\vspace{0.3em}
\begin{block}{Nem kontrollált input}
A DOM maga kezeli az értéket --- React csak beküldéskor kéri le (\texttt{useRef}-fel). Egyszerűbb felépítés, de valós idejű validáció nehezebb.
\end{block}
\end{frame}
\begin{frame}{Miért érdemes kontrollált inputot használni?}
\begin{itemize}
\item Mindig pontos képünk van az aktuális beviteli értékről --- nem kell a DOM-ból "kiolvasni".
\item \textbf{Valós idejű validáció:} hibát jelzünk gépelés közben, nem csak beküldéskor.
\item Feltételes engedélyezés/tiltás, formázás, karakterlimit könnyen kezelhető.
\item Hátránya: sok mezőnél sok state szükséges --- erre nyújtanak megoldást a könyvtárak.
\end{itemize}
\end{frame}
\begin{frame}{Validáció --- mit kell ellenőrizni?}
\begin{itemize}
\item \textbf{Kötelező mezők:} ne lehessen üres beküldés.
\item \textbf{Formátum:} email, telefonszám, irányítószám megfelelő-e?
\item \textbf{Üzleti szabályok:} min. 8 karakteres jelszó, egyező jelszavak, stb.
\item A hibákat erős vizuális visszajelzéssel kell jelezni --- a felhasználó ne találgasson, mi a baj.
\end{itemize}
\end{frame}
\begin{frame}{Miért használjunk könyvtárat?}
\begin{itemize}
\item Kézi megvalósításnál sok ismétl'd' kód keletkezik --- minden mez'höz saját state, validáció, hibaüzenet.
\item \textbf{React Hook Form:} minimális újrarenderelés, nagyon gyors, könnyen tanulható API --- a legtöbb esetben ez az ajánlott.
\item \textbf{Formik:} régebben nagyon népszerű, sok csapat már ismeri; kicsit több boilerplate.
\item \textbf{Zod / Yup:} séma alapú validáló könyvtárak --- a validációs logikát típusbiztos sémában írjuk le, React Hook Form-mal jól kombinálható.
\end{itemize}
\end{frame}