HTML-Formulare existieren seit den frühen 1990er Jahren. Anfangs waren sie schlicht, mit nur Textfeldern, Buttons und Checkboxen. Mit HTML4 kamen neue Input-Typen, die Validierung erleichterten. HTML5 führte spezialisierte Typen (email, date, range) und Elemente wie <datalist> oder <output> ein, um nutzerfreundliche, interaktive Formulare ohne externe Skripte zu ermöglichen. Heute sind Formulare zentral für Web-Interaktionen!
In React hängt i.d.R. an jedem Input ein onChange, das den Input-Value direkt prüft und eventuell ablegt, z.B. in einem State. Damit ist es bspw. möglich dem Nutzer bereits während der Eingabe direktes Feedback zur Validität der Angaben zu geben.
React (und JS im Allgemeinen) erlauben es, die komplette Kontrolle zu übernehmen, wenn ein Formular ausgefüllt oder submitted wird. Seit React 19 gibt es neue Abstraktionen, um dies mit erstklassiger Unterstützung für Datenmutationen zu optimieren. Unter Anderem neue Hooks und verbesserte Unterstützung für serverseitige Datenworkflows bieten deklarative und weniger aufwendige Möglichkeiten bei der Daten-Übermittlung, Verwaltung von Side-Effects oder API-Interaktionen.
Als Datenmutation wird jede Operation bezeichnet, bei der die Anwendung durch Senden von Daten Zustände ändert.
- Absenden eines Formulars
- Senden einer Chat-Nachricht
- Einträge auf einer Datenbank erzeugen/ändern/löschen
- Aufrufen einer API
HTML Grundstruktur:
<form action="/submit" method="POST">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
<label for="email">E-Mail:</label>
<input type="email" id="email" name="email" required>
<input type="submit" value="Absenden">
</form>Datenspeicherung mit FormData:
const key = "Notes";
document.querySelector("form").addEventListener("submit", function (e) {
// e.preventDefault();
try {
const formData = new FormData(e.target);
const newNote = formData.get("name").trim();
if (!newNote) throw new Error("Imput is empty");
const storedData = localStorage.getItem(key)
? JSON.parse(localStorage.getItem(key))
: [];
const newData = [newNote, ...storedData];
localStorage.setItem(key, JSON.stringify(newData));
} catch (error) {
console.log(error);
}
});Attribute des <form>-Tags:
| Attribut | Beschreibung |
|---|---|
action | URL, an die die Formulardaten gesendet werden |
method | HTTP-Methode (GET, POST, dialog) |
enctype | Codierung der Daten (z. B. multipart/form-data für Datei-Upload) |
autocomplete | Steuert die automatische Vervollständigung von Eingabefeldern (on/off) |
novalidate | Deaktiviert die HTML5-Formularvalidierung |
Weitere Formular-Elemente:
| Element | Beschreibung |
|---|---|
<textarea>. | Mehrzeiliges Textfeld |
<select> | Dropdown-Menü, <option> als Auswahlmöglichkeiten |
<label> | Beschriftung für Eingabefelder, verbessert Accessibility |
<fieldset> | Gruppiert verwandte Eingaben visuell und semantisch |
<legend> | Beschriftung für ein <fieldset> |
<datalist> | Vordefinierte Auswahlmöglichkeiten für Input-Felder |
<output> | Anzeige von berechneten Werten |
HTTP-Methoden im Formular:
| Methode | Beschreibung |
|---|---|
GET | Formulardaten werden an die URL angehängt (z. B. ?name=Max&email=max@example.com) |
POST | Formulardaten werden im HTTP-Body gesendet; sicherer für vertrauliche Daten |
dialog | Speziell für Formulare innerhalb von <dialog>-Elementen; schließt das Dialogfenster ohne Daten zu senden oder zu löschen |
Wichtige Input-Typen:
| Typ | Beschreibung / Verwendung |
|---|---|
text | Einfaches einzeiliges Textfeld |
password | Textfeld, Eingabe wird verdeckt |
email | E-Mail-Adresse, mit Validierung |
number | Zahlenfeld, optional mit min, max, step |
checkbox | Auswahlfeld, Mehrfachauswahl möglich |
radio | Auswahlfeld, nur eine Option wählbar |
file | Datei-Upload |
date, time, datetime-local | Datums- oder Uhrzeitauswahl |
range | Schieberegler |
submit | Absende-Button |
reset | Setzt alle Formularwerte zurück |
button | Beliebiger Button, meist für JavaScript-Events |
Events:
#TODO