Jak pracujesz z formularzami w aplikacjach jednostronicowych (SPA)?
sobes.tech AI
Odpowiedź od AI
Pracując z formularzami w SPA, używam kontrolowanych lub niekontrolowanych komponentów.
Kontrolowane komponenty: Wartość pola formularza jest przechowywana w stanie komponentu i aktualizowana za pomocą setState.
// Przykład kontrolowanego komponentu w React
import React, { useState } from 'react';
function MyForm() {
const [name, setName] = useState('');
const handleChange = (event) => {
setName(event.target.value);
};
const handleSubmit = (event) => {
event.preventDefault();
console.log('Wysłano:', name);
};
return (
<form onSubmit={handleSubmit}>
<label>
Imię:
<input type="text" value={name} onChange={handleChange} />
</label>
<button type="submit">Wyślij</button>
</form>
);
}
Zalety komponentów kontrolowanych:
- Łatwiejsza kontrola i walidacja wprowadzanych danych.
- Prostsza implementacja logiki warunkowego wyświetlania pól.
- Łatwa integracja z bibliotekami zarządzania stanem (Redux, Vuex).
Komponenty niekontrolowane: Wartość pola formularza jest przechowywana bezpośrednio w elemencie DOM, do którego dostęp uzyskuje się przez ref.
// Przykład niekontrolowanego komponentu w React
import React, { useRef } from 'react';
function MyUncontrolledForm() {
const inputRef = useRef(null);
const handleSubmit = (event) => {
event.preventDefault();
console.log('Wysłano:', inputRef.current.value);
};
return (
<form onSubmit={handleSubmit}>
<label>
Imię:
<input type="text" ref={inputRef} />
</label>
<button type="submit">Wyślij</button>
</form>
);
}
Zalety komponentów niekontrolowanych:
- Prostsze dla prostych formularzy bez złożonej logiki.
- Mniej kodu do podstawowej implementacji.
Ogólne podejścia przy pracy z formularzami w SPA:
- Walidacja:
- Po stronie klienta (JavaScript) dla natychmiastowej informacji zwrotnej.
- Po stronie serwera dla zapewnienia integralności danych.
- Użycie bibliotek walidacyjnych (Yup, Zod, VeeValidate, Vuelidate).
- Obsługa wysyłki:
- Zapobieganie domyślnemu zachowaniu (
event.preventDefault()). - Wysyłanie danych do serwera (Fetch API, Axios, XHR).
- Wyświetlanie statusu wysyłki (ładowanie, sukces, błąd).
- Zapobieganie domyślnemu zachowaniu (
- Zarządzanie stanem:
- Użycie lokalnego stanu komponentu.
- Użycie menedżerów stanów (Redux, Vuex, Pinia) dla złożonych formularzy lub tych używanych w innych częściach aplikacji.
- Informacja zwrotna dla użytkownika:
- Wskaźniki ładowania.
- Komunikaty o błędach walidacji.
- Komunikaty o sukcesie/błędach wysyłki.
- Dostępność (A11y):
- Użycie semantycznych elementów HTML (
<form>,<label>,<input>,<button>). - Powiązanie
<label>z odpowiednimi polami wejściowymi (atrybutforlub zagnieżdżenie). - Użycie atrybutów WAI-ARIA w razie potrzeby.
- Użycie semantycznych elementów HTML (
- Wydajność:
- Debounce lub throttling zdarzeń
onChangedla pól z częstymi zmianami. - Optymalizacja renderowania przy zmianie stanu formularza.
- Debounce lub throttling zdarzeń
- Testowanie:
- Testy jednostkowe dla logiki formularza i walidacji.
- Testy integracyjne dla interakcji formularza z API.
Wybór między komponentami kontrolowanymi a niekontrolowanymi zależy od złożoności formularza i wymagań dotyczących zarządzania stanem i walidacji. Dla większości formularzy, zwłaszcza tych złożonych, komponenty kontrolowane oferują większą elastyczność i kontrolę.