UI Library

React

React ist die Komponenten-Bibliothek, die deklarative UIs massentauglich gemacht hat. Beschreiben Sie, wie der Bildschirm für einen bestimmten Zustand aussehen soll, und überlassen Sie es React, die Aktualisierung zu übernehmen.

intermediate16 min readUpdated 15. Sept. 2026
Counter.jsx
jsx
// Counter.jsx
import { useState } from "react";

export function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount((c) => c + 1)}>
      Clicked {count} times
    </button>
  );
}
Veröffentlicht
2013, durch Facebook
Modell
Deklarative Komponenten
Sprache
JavaScript + JSX
State
useState und Co.
Datenfluss
Einweg, von oben nach unten
Ökosystem
Next.js, React Router, RSC

Warum es wichtig ist

Warum React gewonnen hat

Alles ist eine Komponente

UIs werden aus kleinen, wiederverwendbaren Funktionen aufgebaut, von denen jede einen Teil des Bildschirms steuert und die frei kombiniert werden können.

Deklarative Updates

Sie beschreiben die UI für den aktuellen Zustand, und React ermittelt die minimalen DOM-Änderungen, um diesen zu erreichen.

Riesiges Ökosystem

Next.js, React Native, React Router und tausende Bibliotheken machen React zu einer Plattform, nicht nur zu einem View-Layer.

Das Gesamtbild

Die drei Kernideen hinter React

Komponenten, State und ein unidirektionaler Datenfluss. Alles andere in React basiert auf diesen drei Konzepten.

Komponenten

Bausteine

Funktionen, die JSX zurückgeben, Props akzeptieren und verschachtelt, wiederverwendet und komponiert werden können.

State

Zustandsänderung

Daten, die einer Komponente gehören. Wenn sich der State aktualisiert, rendert React neu und die UI spiegelt den neuen Wert wider.

Einweg-Datenfluss

Vorhersehbarkeit

Daten fließen über Props nach unten und Änderungen fließen über Callbacks nach oben, was das Verhalten leicht nachvollziehbar macht.

React auf einen Blick

Der Kern von React

Komponenten & JSX

Funktionen, die Markup zurückgeben, geschrieben in einer Syntax, die wie HTML innerhalb von JavaScript aussieht.

Props

Schreibgeschützte Eingaben, die vom Eltern- zum Kindelement übergeben werden – ähnlich wie Argumente bei Funktionen.

State

useState hält Werte, die sich im Laufe der Zeit ändern, und löst bei einer Aktualisierung ein Re-Render aus.

Effects

useEffect führt Side Effects aus, wie das Abrufen von Daten oder das Abonnieren von Events.

Context

Werte über einen gesamten Baum teilen, ohne Props durch jede einzelne Ebene reichen zu müssen.

Hooks

Funktionen, die es Komponenten ermöglichen, State und Lifecycle-Features zu nutzen; sie bilden die Basis für Custom Hooks.

Eine kurze Geschichte

Wie React das Frontend neu geformt hat

  1. 2013

    Open Source

    Facebook veröffentlicht React und führt den Virtual DOM sowie JSX in einer skeptischen Community ein.

    13
  2. 2015

    React Native

    Das Komponentenmodell wird auf iOS und Android ausgeweitet und beweist, dass es nicht an den DOM gebunden ist.

    15
  3. 2019

    Hooks

    useState und useEffect ermöglichen es Funktionskomponenten, eigenen State zu besitzen, und ersetzen die meisten Klassenkomponenten.

    19
  4. 2022

    Concurrent React

    React 18 bringt Automatic Batching, Transitions und Streaming Server Rendering.

    22
  5. Heute

    Server Components

    React Server Components verlagern das Rendering auf den Server und definieren die Art des Datenabrufs neu.

    Heute

Der vollständige Leitfaden

React: Alles was Sie wissen müssen

Was ist React?

React ist eine JavaScript-Bibliothek zum Erstellen von Benutzeroberflächen aus Komponenten. Eine Komponente ist eine Funktion, die Markup zurückgibt, und Sie setzen diese Komponenten zusammen, um eine Seite aufzubauen. Anstatt dem Browser Schritt für Schritt vorzugeben, wie er das DOM ändern soll, beschreiben Sie, wie die UI basierend auf den aktuellen Daten aussehen soll, und React übernimmt die entsprechenden Aktualisierungen.

Dieser Ansatz wird als deklaratives Rendering bezeichnet und ist der Grund, warum sich React im Jahr 2013 so anders anfühlte. Man hört auf, Anweisungen wie „finde dieses Element, ändere seinen Text, schalte diese Klasse um“ zu schreiben, und beginnt stattdessen mit „bei diesem Zustand sieht der Bildschirm so aus“. Der mühsame Teil – das effiziente Vergleichen (Diffing) und Aktualisieren des DOM – wird zur Aufgabe von React.

Komponenten und JSX

Eine React-Komponente ist eine Funktion, deren Name mit einem Großbuchstaben beginnt und die JSX zurückgibt.

// Welcome.jsx
function Welcome({ name }) {
  return <h1>Hello, {name}!</h1>;
}

export default function App() {
  return (
    <main>
      <Welcome name="Ada" />
      <Welcome name="Grace" />
    </main>
  );
}

JSX sieht aus wie HTML, ist aber JavaScript. Geschweifte Klammern betten Ausdrücke ein, und der Compiler übersetzt jedes Element in einen Funktionsaufruf. Da Komponenten lediglich Funktionen sind, können Sie diese komponieren, verschachteln und genauso wiederverwenden wie jede andere Funktion.

Props

Props sind die Inputs einer Komponente. Sie fließen abwärts vom Parent zum Child und sind schreibgeschützt – ein Child darf seine Props niemals mutieren.

// Card.jsx
function Card({ title, children, variant = "default" }) {
  return (
    <article className={`card card--${variant}`}>
      <h3>{title}</h3>
      {children}
    </article>
  );
}

Die children Prop umfasst alles, was du zwischen dem öffnenden und schließenden Tag verschachtelst, wodurch Komponenten zu composable Wrappern werden. Default-Werte ermöglichen es dem Aufrufer, Props wegzulassen, die in der Regel gleich bleiben.

State mit useState

Props sind für einen bestimmten Render-Vorgang fix. State sind Daten, die eine Komponente besitzt und die sich im Laufe der Zeit ändern können. Der useState Hook erstellt einen State-Wert und eine Setter-Funktion.

// Search.jsx
import { useState } from "react";

function Search({ onSearch }) {
  const [query, setQuery] = useState("");

  return (
    <form onSubmit={(e) => { e.preventDefault(); onSearch(query); }}>
      <input
        value={query}
        onChange={(e) => setQuery(e.target.value)}
      />
    </form>
  );
}

Der Aufruf des Setters plant einen Re-Render mit dem neuen Wert. State-Updates erfolgen asynchron und gebündelt (batched). Zudem werden sie ersetzt und nicht zusammengeführt (merge), daher sollte beim Aktualisieren von strukturiertem State immer ein neues Objekt oder Array erstellt werden.

// update.jsx
setUser((prev) => ({ ...prev, name: "Grace" }));
setItems((prev) => [...prev, newItem]);

Die Verwendung der Updater-Funktion stellt sicher, dass der State korrekt aktualisiert wird, wenn der nächste Wert vom vorherigen abhängt.

Listen und Bedingungen rendern

React besitzt keine Template-Sprache für Schleifen und Verzweigungen – stattdessen nutzt man einfaches JavaScript.

// List.jsx
function List({ items }) {
  if (items.length === 0) return <p>Nothing here yet.</p>;

  return (
    <ul>
      {items.map((item) => (
        <li key={item.id}>{item.label}</li>
      ))}
    </ul>
  );
}

Die key Prop ist für Listenelemente erforderlich. Weisen Sie ihr einen stabilen, eindeutigen Wert aus Ihren Daten zu, damit React die Elemente über verschiedene Render-Zyklen hinweg korrekt zuordnen kann. Der Ternary-Operator und && decken Inline-Bedingungen ab, wobei Early Returns oft besser lesbar sind.

Events

React-Events verwenden camelCase-Props und erhalten ein Synthetic-Event-Objekt.

// Button.jsx
<button
  onClick={(event) => {
    event.preventDefault();
    submit();
  }}
>
  Save
</button>

Es ist wichtig, eine Funktion an die Prop zu übergeben – onClick={submit()} würde diese sofort während des Renderings aufrufen. Wenn ein Handler ein Argument benötigt, umschließen Sie ihn mit einer Arrow-Function.

Effects mit useEffect

useEffect synchronisiert deine Komponente mit Systemen außerhalb von React: Netzwerk-Requests, Subscriptions, Timer und direkte DOM-Manipulationen.

// Users.jsx
import { useEffect, useState } from "react";

function Users() {
  const [users, setUsers] = useState([]);

  useEffect(() => {
    const controller = new AbortController();

    fetch("/api/users", { signal: controller.signal })
      .then((res) => res.json())
      .then(setUsers)
      .catch((err) => {
        if (err.name !== "AbortError") console.error(err);
      });

    return () => controller.abort();
  }, []);

  return <ul>{users.map((u) => <li key={u.id}>{u.name}</li>)}</ul>;
}

Das Dependency-Array steuert, wann der Effect erneut ausgeführt wird: Ein leeres Array führt den Effect einmal nach dem Mount aus, eine Liste von Werten führt ihn aus, sobald sich einer dieser Werte ändert, und ohne Array wird er nach jedem Render ausgeführt. Die zurückgegebene Funktion dient dem Cleanup, welcher vor dem nächsten Effect und beim Unmount ausgeführt wird. Bereinige stets Subscriptions und laufende Requests.

Context und Refs

Context teilt einen Wert mit einem gesamten Unterbaum, ohne dass Prop Drilling erforderlich ist.

// theme.jsx
const ThemeContext = createContext("light");

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Button() {
  const theme = useContext(ThemeContext);
  return <button className={theme}>Click</button>;
}

Refs speichern einen veränderbaren Wert oder einen DOM-Knoten, der keinen Re-Render auslösen soll.

// focus.jsx
const inputRef = useRef(null);
useEffect(() => inputRef.current?.focus(), []);
return <input ref={inputRef} />;

Datenfluss und State Lifting

Der Datenfluss in React erfolgt in nur eine Richtung. Wenn zwei Geschwister-Komponenten einen State teilen müssen, wird dieser in die nächstgelegene gemeinsame Elternkomponente gehoben (lifting state). Der Wert wird dann als Prop nach unten gereicht und die Setter-Funktion als Callback. Dies gewährleistet eine einzige Quelle der Wahrheit (single source of truth) und macht den Fluss der Änderungen leicht nachvollziehbar.

Bei tieferen Komponentenbäumen können Context oder eine dedizierte State-Library wie Zustand oder Redux den zusätzlichen Aufwand wert sein. Greifen Sie erst dann zu diesen Mitteln, wenn das Weiterreichen von Props zu mühsam wird, nicht schon vorher.

Hooks und Custom Hooks

Hooks sind Funktionen, mit denen Komponenten auf React-Features zugreifen können. Sie müssen auf der obersten Ebene aufgerufen werden, niemals innerhalb von Bedingungen oder Schleifen. Sobald du sie verstanden hast, kannst du gemeinsam genutzte Logik in einen Custom Hook auslagern.

// useFetch.js
function useFetch(url) {
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);

  useEffect(() => {
    let active = true;
    fetch(url)
      .then((res) => res.json())
      .then((json) => active && setData(json))
      .catch((err) => active && setError(err));
    return () => { active = false; };
  }, [url]);

  return { data, error };
}

Ein Custom Hook ist einfach eine Funktion, deren Name mit use beginnt und die andere Hooks aufruft. Er teilt die Logik, nicht den State – jede Komponente, die ihn verwendet, erhält eine eigene, unabhängige Kopie.

Best Practices

  • Halten Sie Komponenten klein und auf eine einzige Verantwortung fokussiert.
  • Berechnen Sie abgeleitete Werte während des Renderings, anstatt sie im State zu speichern.
  • Verwenden Sie die Updater-Form eines Setters, wenn der nächste Wert vom vorherigen abhängt.
  • Geben Sie jedem Listenelement einen stabilen Key aus Ihren Daten.
  • Räumen Sie Effects auf, insbesondere Subscriptions und ausstehende Requests.
  • Heben Sie den State nur so weit an (Lift State), wie es unbedingt erforderlich ist.
  • Extrahieren Sie wiederkehrende Logik in Custom Hooks.
  • Greifen Sie auf Memoisation (useMemo, useCallback, memo) erst zurück, nachdem Sie ein tatsächliches Problem gemessen haben.

Häufige Fehler

  • Direkte Mutation des State anstatt die Erstellung eines neuen Wertes.
  • Verwendung des Array-Index als Key, was das Reordering beeinträchtigt.
  • Speichern von abgeleiteten Daten im State und deren Synchronisierung über einen Effect.
  • Vergessen des Dependency-Arrays, was zu Endlosschleifen führt.
  • Bedingter Aufruf eines Hooks, wodurch die Rules of Hooks verletzt werden.
  • Optimierung mittels Memoisation, bevor tatsächlich ein Performance-Problem vorliegt.

Wie geht es weiter?

React ist die View-Layer; Next.js ergänzt dies um Routing, Data Fetching und Server Rendering. Vergleiche dieses Modell mit Vue und Svelte und vertiefe deine Grundlagen in JavaScript und TypeScript. Das interaktive React-Tutorial führt dich Schritt für Schritt durch dieselben Konzepte.

Abgeleitete Werte

Wenn ein Wert aus Props oder State berechnet werden kann, berechnen Sie ihn während des Renderns. Ihn im State zu speichern, führt zu Bugs und unnötigen Render-Zyklen.

Bevorzugt
function Cart({ items }) {
  const total = items.reduce(
    (sum, i) => sum + i.price,
    0,
  );
  return <p>Total: {total}</p>;
}
Vermeiden
function Cart({ items }) {
  const [total, setTotal] = useState(0);
  useEffect(() => {
    setTotal(items.reduce(
      (s, i) => s + i.price, 0,
    ));
  }, [items]);
  return <p>Total: {total}</p>;
}

Keys in Listen

Ein stabiler Key ermöglicht es React, Elemente zwischen Render-Zyklen zuzuordnen. Die Verwendung des Index führt zu Problemen beim Umordnen und Bearbeiten.

Bevorzugt
{todos.map((todo) => (
  <Todo key={todo.id} todo={todo} />
))}
Vermeiden
{todos.map((todo, i) => (
  <Todo key={i} todo={todo} />
))}

Häufig gestellte Fragen

Häufig gestellte Fragen

Keep learning

Related topics from the roadmap.

$ Lernen Sie jetzt

Bereit, React zu lernen?

Unser interaktives Tutorial führt Sie Schritt für Schritt durch React — mit Quizzen und echtem Code, den Sie im Browser ausführen können.