Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Virtual DOM und Reconciliation in React erklärt

Virtual DOM und Reconciliation

~16 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Bisher haben wir React als gegeben hingenommen: setState aufrufen, und "irgendwie" aktualisiert sich die Seite. Ab hier schauen wir UNTER die Haube – was passiert GENAU zwischen einem setState-Aufruf und der sichtbaren Änderung im Browser?

Das Problem, das React lösen wollte

Direkte DOM-Manipulation (document.querySelector(...).innerHTML = ...) ist TEUER: jede Änderung kann Layout-Neuberechnung ("Reflow") und Neuzeichnen ("Repaint") des gesamten betroffenen Bereichs auslösen. Bei häufigen, kleinteiligen UI-Updates (wie bei unserem RenderCounter, der bei jedem Klick aktualisiert) wäre naives "bei jeder State-Änderung das komplette HTML neu erzeugen und einsetzen" katastrophal langsam.

Was ist das Virtual DOM wirklich?

Das Virtual DOM ist KEINE geheime Browser-API – es ist ein simples JavaScript-Objektbaum, den React selbst verwaltet, eine leichtgewichtige BESCHREIBUNG dessen, wie das echte DOM aussehen SOLL. Wenn Sie JSX wie <h1>{{name}}</h1> schreiben, kompiliert Babel das zu React.createElement('h1', null, name) – das Ergebnis ist ein simples Objekt wie {{ type: 'h1', props: {{ children: name }} }}, KEIN echter DOM-Knoten.

// Das JSX, das Sie schreiben:
<h1 className="title">Hallo Welt</h1>

// ...wird zu diesem JavaScript-Aufruf kompiliert:
React.createElement('h1', { className: 'title' }, 'Hallo Welt')

// ...der DIESES simple Objekt zurückgibt (stark vereinfacht):
{
  type: 'h1',
  props: { className: 'title', children: 'Hallo Welt' },
}

Reconciliation: der Vergleichs- und Update-Prozess

Reconciliation ("Abgleich") ist der Prozess, mit dem React herausfindet, was sich zwischen zwei Virtual-DOM-Bäumen geändert hat. Bei jedem setState erzeugt React einen KOMPLETT NEUEN Virtual-DOM-Baum für die betroffene Komponente (und ihre Kinder) und vergleicht ihn mit dem vorherigen ("Diffing"). Nur die TATSÄCHLICH geänderten Teile werden als minimale Anweisungen an das echte DOM weitergegeben – eine gezielte textContent-Änderung statt eines kompletten innerHTML-Neuaufbaus.

Warum React NICHT jeden möglichen Baumvergleich probiert

Ein mathematisch VOLLSTÄNDIGER Baumvergleich zweier beliebiger Bäume ist rechnerisch extrem teuer (O(n³) im allgemeinen Fall). React nutzt stattdessen zwei praktische Heuristiken, die den Vergleich auf O(n) reduzieren:

  • Verschiedene Element-Typen erzeugen verschiedene Bäume. Wechselt ein <div> zu einem <span> an derselben Stelle, wirft React den GESAMTEN alten Teilbaum weg und baut komplett neu, statt nach Gemeinsamkeiten zu suchen.
  • Keys identifizieren Elemente über Renders hinweg. Genau das key-Prop aus dem .map()-Aufruf in unserer ProductListPage (Kapitel 7 aus "React für Einsteiger") – ohne stabile Keys vergleicht React Listen-Elemente nur nach POSITION, was bei Einfügungen/Löschungen in der Mitte einer Liste zu unnötigen Neu-Erstellungen führt.

Das Key-Problem am eigenen Projekt sichtbar machen

Erinnern Sie sich an ProductCards isFavorite-State aus "React für Einsteiger"? Er lebt INNERHALB der Komponenteninstanz, verknüpft über den key. Öffnen Sie den React DevTools "Components"-Tab, wählen Sie eine ProductCard, setzen Sie isFavorite manuell auf true (im DevTools-Panel editierbar). Wechseln Sie dann auf die nächste Pagination-Seite und wieder zurück – React erstellt bei gleichbleibenden key-Werten (product.sku) für WIEDERKEHRENDE Produkte KEINE neue Komponenteninstanz, ihr lokaler State bliebe (bei gleichem Produkt) erhalten. Ohne stabile, eindeutige Keys (z. B. bei Verwendung des Array-INDEX als Key bei einer sich ändernden Liste) würde React hier fälschlich State zwischen POSITIONEN statt zwischen ECHTEN Entitäten verknüpfen.

Achtung: Das ist GENAU der Grund, warum "React für Einsteiger" Kapitel 7 von key={{index}} abgeraten hat: Der Index ist keine stabile Identität der Sache selbst, nur ihrer aktuellen Position. Fügt sich ein Element vor Position 0 ein, "verschiebt" sich aus React-Sicht der GESAMTE nachfolgende State um eine Position – mit teils bizarren Bugs als Folge (falscher Input-Fokus, falsch zugeordneter lokaler State).

Die Verbindung zu den letzten Kapiteln

Jetzt schließt sich der Kreis zu allem, was wir in den letzten Kapiteln gelernt haben: React.memo (Kapitel 31) überspringt Reconciliation für eine Komponente KOMPLETT, wenn Props unverändert sind – die teure Diff-Berechnung entfällt dann ganz. Virtualisierung (Kapitel 32) reduziert, wie viele Elemente überhaupt in den zu vergleichenden Bäumen existieren. Stabile Keys sorgen dafür, dass Reconciliation bei Listen-Änderungen MINIMALE statt MAXIMALE Arbeit verursacht.

Tipp: Merksatz: "Virtual DOM" ist keine Performance-Magie an sich – reines direktes DOM-Manipulieren kann in Mikro-Benchmarks sogar SCHNELLER sein als React's Diffing-Overhead. Der eigentliche Wert liegt woanders: Sie schreiben deklarativen Code ("so soll die UI für DIESEN State aussehen"), React übernimmt das Herausfinden der EFFIZIENTESTEN Übersetzung in echte DOM-Operationen – ein enormer Produktivitätsgewinn, der die meisten Apps schnell GENUG macht, ohne dass Sie jemals manuell DOM-Diffs schreiben müssen.