Przejdź do głównej zawartości

08. Formularze w React

Formularze w React

W React są dwa podejścia do formularzy: controlled components (React kontroluje wartość przez state) i uncontrolled components (DOM przechowuje wartość, useRef pobiera ją). Kluczowe dla każdej aplikacji z rejestracją, logowaniem, filtrami.

  1. Controlled component? — Wartość inputa żyje w state React, onChange aktualizuje state
  2. Uncontrolled component? — Wartość w DOM, useRef.current.value do odczytu przy submit
  3. Kiedy co? — Controlled dla walidacji w czasie rzeczywistym; uncontrolled dla prostych przypadków
  4. Walidacja? — Sprawdzanie danych przed submit, wyświetlanie błędów przy polach
  1. Controlled component — input + useState + onChange handler
  2. Formularz wielopolowy — jeden state obiektowy, generyczny handler
  3. Submit handlere.preventDefault(), wysłanie danych
  4. Walidacja — inline validation przy onChange, błędy przy polach
  5. UncontrolleduseRef + defaultValue

Schemat

Controlled: User types → onChange event → setState → re-render → input.value aktualizowany przez React. Uncontrolled: User types → DOM updates value → submit → useRef.current.value.

Przykład kodu JSX

Formularz rejestracji z walidacją: name, email, password, confirmPassword — z komunikatami błędów.

  • Controlled input z useState
  • Submit handler z preventDefault
  • Prosty formularz login

Forma: 10 slajdów, 10 minut

Ocena: 3.0
function LoginForm() {
const [formData, setFormData] = useState({ email: '', password: '' });
const [errors, setErrors] = useState({});
const handleChange = (e) => {
const { name, value } = e.target;
setFormData(prev => ({ ...prev, [name]: value }));
// Walidacja w czasie rzeczywistym
if (name === 'email' && !value.includes('@')) {
setErrors(prev => ({ ...prev, email: 'Podaj poprawny email' }));
} else {
setErrors(prev => ({ ...prev, [name]: '' }));
}
};
const handleSubmit = async (e) => {
e.preventDefault();
if (!formData.email || !formData.password) {
setErrors({ email: 'Wymagane', password: 'Wymagane' });
return;
}
// Wyślij dane do API
console.log('Logowanie:', formData);
};
return (
<form onSubmit={handleSubmit}>
<div>
<input
name="email"
type="email"
value={formData.email}
onChange={handleChange}
placeholder="Email"
/>
{errors.email && <span className="error">{errors.email}</span>}
</div>
<div>
<input
name="password"
type="password"
value={formData.password}
onChange={handleChange}
placeholder="Hasło"
/>
{errors.password && <span className="error">{errors.password}</span>}
</div>
<button type="submit">Zaloguj</button>
</form>
);
}

Pokaż controlled na żywo

Wpiszcie coś w pole i pokażcie jak React state zmienia się w czasie rzeczywistym — DevTools → Components → state. Klasa zobaczy “magic” Reacta.

Tabela porównawcza

Slajd z tabelą: Controlled (pełna kontrola, walidacja w locie, więcej kodu) vs Uncontrolled (prosto, mało kodu, trudna walidacja).

Formularze są wszędzie!

Login, rejestracja, checkout, filtry — każda aplikacja potrzebuje formularzy. Ten temat to czysty pragmatyzm projektowy!