Lerne, jedes Formularfeld über den React-State zu steuern, damit du zuverlässige Daten validieren und absenden kannst.
Diese Lektion in Kodokon öffnenIn React wird ein Formular vorhersehbar, wenn jedes Feld kontrolliert ist: Der angezeigte Wert kommt aus dem State der Komponente, und jeder Tastendruck läuft über onChange, um diesen State zu aktualisieren. Das DOM ist nicht mehr die Quelle der Wahrheit - dein State ist es. In der Praxis bindest du die value-Prop an eine State-Variable und stellst einen Handler bereit, der die Update-Funktion aufruft.
import { useState } from "react";
function EmailField() {
const [email, setEmail] = useState("");
return (
<input
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
/>
);
}Ein echtes Formular hat selten nur ein einziges Feld. Statt useState-Aufrufe zu stapeln, fasst du die Werte in einem Objekt zusammen und schreibst einen generischen Handler. Das name-Attribut jedes Feldes muss exakt einem Schlüssel des Objekts entsprechen: Genau das sagt dem Handler, welche Eigenschaft er aktualisieren soll.
const [form, setForm] = useState({
username: "",
password: "",
});
function handleChange(e) {
const { name, value } = e.target;
setForm((prev) => ({ ...prev, [name]: value }));
}Bleibt noch das Absenden. Standardmäßig lädt der Browser die Seite neu, wenn ein Formular abgeschickt wird: Rufe e.preventDefault() ganz oben in deinem onSubmit-Handler auf. Das ist auch der richtige Ort, um die Daten zu validieren, bevor du sie sendest, da der gesamte Formular-State bereits zur Hand ist.
function handleSubmit(e) {
e.preventDefault();
if (form.username.trim() === "") {
alert("Username is required.");
return;
}
console.log("Submitting:", form);
}
return (
<form onSubmit={handleSubmit}>
<input
name="username"
value={form.username}
onChange={handleChange}
/>
<button type="submit">Create account</button>
</form>
);value={email} an ein <input>, ohne ein onChange bereitzustellen. Was passiert?e.preventDefault() im onSubmit-Handler da?