Przejdź do głównej zawartości

19. React Hook Form

React Hook Form

React Hook Form (RHF) to biblioteka do formularzy, która minimalizuje re-rendery i boilerplate. Zamiast useState dla każdego pola — useForm rejestruje pola przez ref i waliduje przy submit lub w czasie rzeczywistym. Wydajność: 0 re-renderów przy wpisywaniu.

  1. Problem controlled forms? — Każde wciśnięcie klawisza = re-render całego formularza
  2. Jak RHF eliminuje re-rendery? — Uncontrolled inputs z refs, stan w RHF nie w React state
  3. register — co robi? — Rejestruje pole: ref + name + validation rules
  4. handleSubmit? — Waliduje wszystkie pola, wywołuje callback tylko gdy valid
  1. Problem formularzy w React — boilerplate, wydajność
  2. useForm — podstawy — register, handleSubmit, formState
  3. Walidacja — required, minLength, pattern, custom validate
  4. Błędy — formState.errors, komunikaty przy polach
  5. watch — obserwowanie wartości pól

Schemat

Porównanie re-renderów: controlled form (każdy keystroke = re-render) vs RHF (0 re-renderów przy wpisywaniu, tylko przy submit/validate). Diagram z licznikiem renderów.

Przykład kodu JSX

Formularz rejestracji z 5 polami i walidacją — porównaj ile kodu bez RHF vs z RHF.

  • Problem formularzy bez RHF
  • useForm, register, handleSubmit
  • Podstawowa walidacja (required, minLength)

Forma: 10 slajdów, 10 minut

Ocena: 3.0
import { useForm } from 'react-hook-form';
function RegisterForm() {
const {
register,
handleSubmit,
watch,
formState: { errors, isSubmitting },
} = useForm();
const password = watch('password'); // Obserwuj hasło dla potwierdzenia
const onSubmit = async (data) => {
await createUser(data);
console.log('Zarejestrowano:', data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div>
<input
{...register('email', {
required: 'Email jest wymagany',
pattern: { value: /^\S+@\S+\.\S+$/, message: 'Niepoprawny email' }
})}
placeholder="Email"
/>
{errors.email && <span>{errors.email.message}</span>}
</div>
<div>
<input
type="password"
{...register('password', {
required: 'Hasło jest wymagane',
minLength: { value: 8, message: 'Min. 8 znaków' }
})}
placeholder="Hasło"
/>
{errors.password && <span>{errors.password.message}</span>}
</div>
<div>
<input
type="password"
{...register('confirmPassword', {
required: 'Potwierdź hasło',
validate: value => value === password || 'Hasła nie są takie same'
})}
placeholder="Potwierdź hasło"
/>
{errors.confirmPassword && <span>{errors.confirmPassword.message}</span>}
</div>
<button type="submit" disabled={isSubmitting}>
{isSubmitting ? 'Rejestrowanie...' : 'Zarejestruj'}
</button>
</form>
);
}

Pokaż licznik renderów

Dodajcie console.log('render') do formularza. Controlled form: log przy każdym klawiszu. RHF: log tylko przy submit. Różnica jest natychmiastowo widoczna!

Liczba kodu

Pokażcie to samo w vanilla React (60 linii) vs RHF (25 linii). Oszczędność 60% kodu robi wrażenie.

Formularze bez bólu!

React Hook Form to biblioteka używana w tysiącach produkcyjnych aplikacji. Opanujcie ją a formularze przestaną być straszne!