Hoe werk je met formulieren in single-page applicaties (SPA)?
sobes.tech AI
Antwoord van AI
Bij het werken met formulieren in SPA gebruik ik gecontroleerde (controlled) of niet-gecontroleerde (uncontrolled) componenten.
Gecontroleerde componenten: De waarde van het formulier veld wordt opgeslagen in de toestand van het component en wordt bijgewerkt via setState.
// Voorbeeld van een gecontroleerd component in 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('Verzonden:', name);
};
return (
<form onSubmit={handleSubmit}>
<label>
Naam:
<input type="text" value={name} onChange={handleChange} />
</label>
<button type="submit">Verzenden</button>
</form>
);
}
Voordelen van gecontroleerde componenten:
- Makkelijker te controleren en te valideren.
- Eenvoudiger logica voor voorwaardelijke weergave van velden.
- Gemakkelijk te integreren met state management libraries (Redux, Vuex).
Niet-gecontroleerde componenten: De waarde van het formulier veld wordt direct in het DOM-element opgeslagen en toegankelijk via ref.
// Voorbeeld van een niet-gecontroleerd component in React
import React, { useRef } from 'react';
function MyUncontrolledForm() {
const inputRef = useRef(null);
const handleSubmit = (event) => {
event.preventDefault();
console.log('Verzonden:', inputRef.current.value);
};
return (
<form onSubmit={handleSubmit}>
<label>
Naam:
<input type="text" ref={inputRef} />
</label>
<button type="submit">Verzenden</button>
</form>
);
}
Voordelen van niet-gecontroleerde componenten:
- Eenvoudiger voor eenvoudige formulieren zonder complexe logica.
- Minder code voor basisimplementatie.
Algemene aanpak bij werken met formulieren in SPA:
- Validatie:
- Aan de clientzijde (JavaScript) voor directe feedback.
- Aan de serverzijde voor dataintegriteit.
- Gebruik van validatiebibliotheken (Yup, Zod, VeeValidate, Vuelidate).
- Verwerking van verzending:
- Voorkomen van standaard gedrag (
event.preventDefault()). - Gegevens naar server sturen (Fetch API, Axios, XHR).
- Weergave van verzendstatus (laden, succes, fout).
- Voorkomen van standaard gedrag (
- Staatbeheer:
- Gebruik van lokale componentstatus.
- Gebruik van state managers (Redux, Vuex, Pinia) voor complexe formulieren of formulieren die elders worden gebruikt.
- Gebruikersfeedback:
- Laadindicatoren.
- Validatiefoutenberichten.
- Succes-/foutberichten bij verzending.
- Toegankelijkheid (A11y):
- Gebruik van semantische HTML-elementen (
<form>,<label>,<input>,<button>). - Koppeling van
<label>aan de juiste invoervelden (attribuutforof nesting). - Gebruik van WAI-ARIA-attributen indien nodig.
- Gebruik van semantische HTML-elementen (
- Prestaties:
- Debounce of throttling van
onChange-gebeurtenissen voor velden met frequente wijzigingen. - Optimalisatie van rendering bij wijziging van formulierstatus.
- Debounce of throttling van
- Testen:
- Unit-tests voor logica en validatie.
- Integratietests voor interactie van formulier met API.
De keuze tussen gecontroleerde en niet-gecontroleerde componenten hangt af van de complexiteit van het formulier en de eisen aan staatbeheer en validatie. Voor de meeste formulieren, vooral complexe, bieden gecontroleerde componenten meer flexibiliteit en controle.