In einem Satz
React ist eine JavaScript-Bibliothek zum Erstellen von Benutzeroberflächen, indem man sie in eigenständige, wiederverwendbare Code-Teile, sogenannte „Komponenten“, zerlegt, die sich automatisch aktualisieren, wenn sich ihre Daten ändern.
Welches Problem es löst
Stell dir die Webentwicklung in den alten Tagen vor (sagen wir, in den frühen 2010ern). Du hattest eine Webseite und wolltest sie interaktiv machen. Vielleicht sollte ein „Gefällt mir“-Button blau werden und ein Zähler hochzählen, wenn man darauf klickt. Mit einem Tool wie jQuery hättest du Code geschrieben, der besagt: „Finde den Button auf der Seite, lausche auf einen Klick, und wenn er passiert, finde das Zähler-Element und ändere seinen Text, dann finde das Button-Icon und ändere seine Farbe.“
Das ist ein imperativer Ansatz. Du gibst dem Browser ein schrittweises Rezept, wie er die Seite ändern soll. Das funktioniert für einen Like-Button. Aber was ist mit einem kompletten Social-Media-Feed mit Hunderten von Beiträgen, Kommentaren, Benachrichtigungen und einem Live-Chat-Fenster, die sich alle gleichzeitig aktualisieren? Die „Rezepte“ werden zu einem Wirrwarr aus Spaghetti-Code. Eine Änderung an einer Stelle könnte unvorhersehbar etwas völlig anderes kaputt machen. Die Benutzeroberfläche konsistent mit den Daten der Anwendung zu halten, war ein ständiger, fehleranfälliger Kampf.
Facebook erlebte diesen Albtraum im großen Stil. 2011 entwickelten sie intern React, um dieses Problem zu lösen. React führte ein deklaratives Modell ein. Anstatt dem Browser zu sagen, wie er Dinge ändern soll, beschreibst du nur, wie die Benutzeroberfläche für einen bestimmten Zustand aussehen soll. Du deklarierst: „Wenn der Beitrag liked ist, sollte der Button blau sein und der Zähler 101 anzeigen. Wenn er nicht liked ist, ist der Button grau und der Zähler steht bei 100." Das ist alles. Wenn sich der liked-Zustand von false auf true ändert, kümmert sich React darum, den effizientesten Weg zu finden, um den Button und den Zähler zu aktualisieren. Es übernimmt das „Wie“, damit du dich auf das „Was“ konzentrieren kannst.
Dieser Wechsel vom imperativen zum deklarativen Denken war eine Revolution. Er machte das Erstellen komplexer, datengesteuerter UIs vorhersehbarer, skalierbarer und leichter zu debuggen.
Wie es unter der Haube funktioniert
Reacts „Magie“ ist nicht wirklich Magie; es ist eine clevere Kombination aus drei Kernideen: JSX, Komponenten mit State und dem Virtual DOM.
JSX: JavaScript mit Zuckerguss
Wenn du dir React-Code ansiehst, siehst du etwas, das stark an HTML erinnert, das direkt in JavaScript eingebettet ist. Das ist JSX (JavaScript XML).
const greeting = <h1>Hallo, FlowingDev-User!</h1>;
Dein Browser hat keine Ahnung, was er damit anfangen soll. Es ist kein gültiges JavaScript. Bevor dieser Code ausgeführt werden kann, muss er von einem Tool wie Babel „transpiliert“ (umgewandelt) werden. Die obige JSX-Zeile wird in einen normalen JavaScript-Funktionsaufruf umgewandelt.
const greeting = React.createElement("h1", null, "Hallo, FlowingDev-User!");
Jeder JSX-Tag wird zu einem React.createElement()-Aufruf. Dieser Funktionsaufruf erzeugt kein echtes HTML-Element. Er erzeugt ein leichtgewichtiges JavaScript-Objekt, das das Element beschreibt, das du erstellen möchtest – seinen Typ (h1), seine Eigenschaften (in diesem Fall keine, also null) und seine Kinder („Hallo...“). Diese Objekte sind die Bausteine des Virtual DOM.
JSX ist also nur „syntaktischer Zucker“. Es ermöglicht uns, unsere UI mit einer vertrauten, HTML-ähnlichen Syntax zu beschreiben, aber unter der Haube erstellen wir nur einen Baum aus JavaScript-Objekten.
Komponenten und State: Das Gehirn der Operation
Eine Komponente ist eine JavaScript-Funktion, die etwas JSX zurückgibt. Sie ist ein wiederverwendbares, in sich geschlossenes Stück UI.
function Greeting({ name }) {
return <h1>Hallo, {name}!</h1>;
}
Diese Greeting-Komponente ist einfach. Sie nimmt einen name als Eingabe (genannt „Prop“) und rendert eine Überschrift. Aber was, wenn eine Komponente sich Dinge merken und sich im Laufe der Zeit ändern soll, wie ein Zähler? Dafür brauchen wir „State“.
State sind Daten, die eine Komponente „besitzt“ und ändern kann. React stellt spezielle Funktionen namens „Hooks“ zur Verfügung, um dies zu verwalten. Der gebräuchlichste ist useState.
import { useState } from 'react';
function Counter() {
// "count" ist unsere State-Variable.
// "setCount" ist die *einzige* Funktion, die wir verwenden dürfen, um sie zu aktualisieren.
const [count, setCount] = useState(0); // Der Anfangswert ist 0.
return (
<div>
<p>Du hast {count} Mal geklickt</p>
<button onClick={() => setCount(count + 1)}>
Klick mich
</button>
</div>
);
}
Wenn du setCount(count + 1) aufrufst, änderst du nicht nur eine Variable. Du sagst React: „Hey, der State für diese Counter-Komponente hat sich geändert. Bitte führe diese Funktion erneut aus, um die neue UI zu erhalten, und aktualisiere dann den Bildschirm.“ React „rendert“ dann die Komponente neu, holt sich das neue JSX mit dem aktualisierten count und aktualisiert effizient die Webseite.
Das Virtual DOM: Reacts Geheimwaffe
Das direkte Ändern des echten Browser-DOMs (des live im Browser dargestellten Baums von HTML-Elementen) ist langsam. Es ist, als würde man ein Zimmer neu dekorieren, indem man alle Wände einreißt und neu aufbaut, obwohl man nur einen Bilderrahmen verschieben wollte.
React vermeidet diese teure Arbeit mit seiner Geheimwaffe: dem Virtual DOM (VDOM). Das VDOM ist nur eine Kopie des DOM, die im JavaScript-Speicher gehalten wird. Es ist genau der Baum von React.createElement-Objekten, über den wir gesprochen haben.
Hier ist der Prozess, bekannt als Reconciliation (Abgleich):
- Initiales Rendern: Wenn
Counterzum ersten Mal gerendert wird, baut React einen VDOM-Baum, der eindivbeschreibt, das einpmit dem Text „Du hast 0 Mal geklickt“ und einenbuttonenthält. Daraus erstellt es dann die echten DOM-Elemente auf der Seite. - State-Änderung: Du klickst auf den Button.
setCount(1)wird aufgerufen. - Neu-Rendern und neues VDOM: React führt die
Counter-Funktion erneut aus. Es baut einen neuen VDOM-Baum. Dieser neue Baum ist fast identisch mit dem alten, aber daspbeschreibt jetzt den Text „Du hast 1 Mal geklickt“. - Diffing: Reacts „Diffing“-Algorithmus vergleicht den neuen VDOM-Baum mit dem alten. Er flitzt durch beide hindurch und findet die Unterschiede. In diesem Fall findet er nur einen einzigen Unterschied: Der Text im
<p>-Tag hat sich geändert. - Batch-Update: React nimmt diese eine winzige Änderung und wendet sie auf das echte DOM an. Es fasst das
divoder denbuttonnicht an; es aktualisiert nur den Text desp.
Dieser Diff-and-Patch-Prozess ist unglaublich schnell. Indem Updates gebündelt und direkte Manipulationen des langsamen, echten DOMs minimiert werden, sorgt React dafür, dass sich UIs blitzschnell und reaktionsfreudig anfühlen, selbst wenn sich komplexe Daten schnell ändern.
Geschichten aus der Praxis
Der Fall der verschwindenden Formulardaten
Ein Junior-Entwickler sollte ein komplexes, mehrstufiges Benutzerregistrierungsformular erstellen. Jeder Schritt war eine andere Komponente. An einer Stelle brauchte er eine kleine Checkbox in Schritt 2, um bedingt ein zusätzliches Eingabefeld anzuzeigen. Er implementierte es, aber plötzlich trat ein bizarrer Bug auf: Immer wenn ein Benutzer diese Box ankreuzte, verschwanden alle Daten, die er in Schritt 2 eingegeben hatte.
Der Übeltäter war ein Missverständnis von „Keys“. Um das zusätzliche Feld anzuzeigen, änderte der Entwickler die Struktur seines JSX so, dass React dachte, die gesamte Formularkomponente für Schritt 2 sei eine neue und andere Komponente. Ohne einen stabilen key-Prop, um sie zu identifizieren, zerstörte React die alte Komponente (zusammen mit all ihrem State, d. h. den Eingaben des Benutzers) und hängte stattdessen eine brandneue ein.
Die Lektion: Der key-Prop ist nicht nur für Listen da. Er ist eine stabile Identität für eine Komponente. Zu verstehen, wie React Keys verwendet, um Komponenten über mehrere Render-Vorgänge hinweg zu verfolgen, ist entscheidend, um den State zu erhalten und unerwartete Resets zu vermeiden.
Der unendliche API-Hammer
Ein Team entwickelte ein Dashboard, das Live-Aktiendaten anzeigte. Ein Entwickler schrieb eine Komponente, um den neuesten Preis für eine bestimmte Aktie mit dem useEffect-Hook abzurufen. Der Code sah ungefähr so aus:
useEffect(() => {
fetchStockPrice(stockSymbol).then(price => {
setPrice(price); // Den State mit dem neuen Preis aktualisieren
});
}); // Ups, kein Dependency Array!
Sobald die Komponente geladen wurde, fror die App ein, der Lüfter am Laptop des Entwicklers drehte hoch, und die Netzwerküberwachung zeigte Tausende von identischen API-Anfragen pro Sekunde. Sie hatten eine Endlosschleife erschaffen. Das useEffect holte Daten und rief setPrice auf. Das State-Update führte dazu, dass die Komponente neu gerendert wurde. Da das useEffect kein Dependency Array hatte, lief es nach jedem Rendern erneut, holte die Daten erneut, aktualisierte den State erneut, verursachte ein weiteres Rendern, und so weiter bis in alle Ewigkeit.
Die Lektion: React-Hooks wie useEffect sind mächtige, aber präzise Werkzeuge. Du musst ein „Dependency Array“ angeben, um React zu sagen, wann der Effekt erneut ausgeführt werden soll. Lässt man es weg, bedeutet das „nach jedem einzelnen Rendern ausführen“, was bei State-Updates ein Rezept für eine Katastrophe ist.
Häufige Fehler und Fallstricke
- State direkt verändern (mutieren). Mache niemals
myState.prop = 'value'odermyArray.push('item'). Reacts Änderungserkennung basiert auf Objekt- und Array-Identitäten. Wenn dusetStateaufrufst, musst du ein neues Objekt oder Array bereitstellen (z. B. mit der Spread-Syntax...), damit React die Änderung bemerkt. keys in Listen vergessen. Wenn du eine Liste von Elementen mit.map()renderst, musst du jedem Element einen einzigartigen und stabilenkey-Prop geben (wieitem.id). So kann Reacts Diffing-Algorithmus effizient verfolgen, welche Elemente verschoben, hinzugefügt oder entfernt wurden. Den Array-Index als Key zu verwenden, ist ein häufiges Anti-Pattern, das zu Fehlern führen kann.- JSX wie HTML behandeln. Es ist ähnlich, aber nicht dasselbe. Du musst
classNamestattclass,htmlForstattforund camelCase für Style-Eigenschaften (backgroundColornichtbackground-color) verwenden. Außerdem müssen alle Tags geschlossen werden, also ist ein Bild<img ... />, nicht<img>. - Denken, Hooks wären Magie. Hooks wie
useStateunduseEffectfolgen strengen Regeln (z. B. dürfen sie nur auf der obersten Ebene einer Funktionskomponente aufgerufen werden). Sie funktionieren, indem sie sich auf eine konsistente Aufrufreihenfolge zwischen den Render-Vorgängen verlassen. Der Versuch, sie in Schleifen oder Bedingungen aufzurufen, wird deine App zum Absturz bringen.
Warum du es auf dem Schirm haben solltest
React ist nicht nur eine Bibliothek; es ist ein Ökosystem und eine Denkweise. Es steckt hinter einem riesigen Teil des modernen Webs, von gigantischen Seiten wie Instagram und Netflix bis hin zu unzähligen Startups und internen Tools. React zu lernen bedeutet, eine komponentenbasierte Architektur zu lernen, die wiederverwendbaren, testbaren und wartbaren Code fördert.
Selbst wenn du React nicht täglich verwendest, wird das Verständnis seiner Kernprinzipien – deklarative UI, State-Management und das VDOM – dich zu einem besseren Entwickler machen. Diese Konzepte haben fast jedes andere moderne UI-Framework beeinflusst, von Vue bis Svelte. Darüber hinaus können mit React Native dieselben Fähigkeiten und Prinzipien verwendet werden, um native mobile Apps für iOS und Android zu erstellen. Es ist ein mächtiges Paradigma, das für jeden Entwickler, der heute an Benutzeroberflächen arbeitet, unerlässlich ist.
Tauche tiefer ein
- React Docs (Offiziell) - Die offizielle Dokumentation ist der beste Ausgangspunkt, mit einem umfassenden Tutorial und tiefgehenden Erklärungen.
- Introducing JSX (React Docs) - Die offizielle Erklärung zu JSX und wie es sich von HTML unterscheidet.
- Reconciliation (React Docs) - Der Algorithmus, den React verwendet, um zwei VDOM-Bäume zu vergleichen und die UI effizient zu aktualisieren.
- The Rules of Hooks (React Docs) - Die wesentlichen Regeln, die du bei der Verwendung von Hooks wie
useStateunduseEffectbefolgen musst. - MDN: Einführung in das DOM - Um zu verstehen, was React manipuliert, ist es wichtig, das Document Object Model selbst zu verstehen.
Wie ein Editor Code versteht
Die Farben stammen vom Sprachparser, nicht von der Programmausführung. CodeMirror und Lezer erkennen Zeichen und Struktur lokal im Browser. Vorschläge kombinieren Schlüsselwörter, lokale Namen soweit unterstützt, Snippets und eine kleine integrierte Referenz; beim Überfahren dokumentierter Symbole erscheint die Signatur. Ein Vorschlag garantiert nicht, dass die API in der Laufzeit existiert. Parserdiagnosen erkennen fehlerhafte Syntax soweit unterstützt, ersetzen aber weder Typprüfung noch Ausführung: syntaktisch gültiger Code kann trotzdem scheitern. Ruby und Lua nutzen tokenbasierte Modi mit eingeschränkten Diagnosen. Es gibt keinen entfernten Sprachserver; der Quelltext bleibt auf dem Gerät.
CodeMirror & Lezer: MIT.