0Pricing
React Academy · Lektion

Layout-Thrashing und visuelles Flackern vermeiden

Erkennen, wann useEffect sichtbares Flackern verursacht, und das Problem durch useLayoutEffect beheben

Layout-Thrashing und visuelles Flackern vermeiden ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist Layout-Thrashing

Layout-Thrashing tritt auf, wenn JavaScript in einer Schleife abwechselnd DOM-Eigenschaften liest und in das DOM schreibt. Jeder Lesevorgang nach einem Schreibvorgang zwingt den Browser, das Layout synchron neu zu berechnen, um einen korrekten Wert zurückzugeben. Dadurch können aus einer eigentlich einzigen Layout-Berechnung Dutzende werden, was die Performance erheblich beeinträchtigt.

Wie Reacts Batch-Aktualisierungen helfen

React bündelt alle setState-Aufrufe innerhalb von Event-Handlern und Effects zu einem einzigen erneuten Render-Vorgang. Dieses natürliche Batching verhindert das Lese-Schreib-Lese-Muster, das innerhalb eines einzelnen Render-Zyklus Thrashing verursacht. In React 18 gilt das Batching auch für asynchrone Callbacks und Promises, wodurch Layout-Thrashing durch nebenläufige Zustandsaktualisierungen reduziert wird.

Wann Flackern in useEffect auftritt

Flackern tritt auf, wenn ein useEffect das DOM liest, den State aktualisiert, ein erneutes Rendern auslöst und der Browser zweimal zeichnet: einmal mit dem initialen State und einmal mit dem korrigierten State. Die erste Darstellung blitzt kurz auf, bevor sie ersetzt wird. Dies fällt besonders bei Effects auf, die Layout-Eigenschaften wie Höhe, Breite oder Position anpassen.

Flackern mit DevTools diagnostizieren

Öffnen Sie die Chrome DevTools, wechseln Sie zum Tab Rendering (über das Dreipunktmenü unter Weitere Tools) und aktivieren Sie „Paint flashing“. Bereiche, die neu gezeichnet werden, werden grün hervorgehoben. Wenn eine Komponente beim ersten Rendern aufblitzt und anschließend sofort mit einem anderen Layout erneut gezeichnet wird, bestätigt dies einen Double-Paint durch ein von useEffect ausgelöstes State-Update.

Flackern durch Wechsel zu useLayoutEffect beheben

Verschieben Sie DOM-Lesevorgänge und die daraus resultierenden State-Updates von useEffect nach useLayoutEffect. Dieselbe Messung und das State-Update erfolgen nun synchron vor dem Paint, React rendert neu und committet im selben Block, und der Browser zeichnet nur den finalen, korrekten State. Das grüne Flackern in den DevTools verschwindet.

Das Muster mit nur einem Paint

Das Muster ohne Flackern lautet: Lesen Sie das DOM in useLayoutEffect, rufen Sie setState mit der Messung auf, React rendert synchron neu, committet das korrigierte DOM und der Browser zeichnet einmal mit dem finalen Ergebnis. Dies ist das Standardmuster für die Positionierung von Tooltips, Offsets von Sticky Headers und die Einrichtung von Animationen.

Gültige Anwendungsfälle für useEffect

Der überwiegende Teil der Effects gehört in useEffect: Datenabrufe (das Flackern beim Laden ist akzeptabel und erwartbar), Abonnements von Events oder Streams, Logging und Analytics, Timer sowie alle Effects, die das sichtbare Layout nicht unmittelbar beeinflussen. Eine übermäßige Verwendung von useLayoutEffect, obwohl useEffect ausreichen würde, ist ein Anti-Pattern und beeinträchtigt die Performance.

Gültige Anwendungsfälle für useLayoutEffect

Reservieren Sie useLayoutEffect für DOM-Messungen, die in die visuelle Ausgabe zurückfließen: Tooltip-Positionen, Logik auf Grundlage der Elementgröße, die Wiederherstellung der Scroll-Position und die Einrichtung von Animationen, bei der anfängliche Abmessungen gelesen werden. Ein eindeutiges Anzeichen für einen Wechsel ist ein sichtbares, einen Frame langes Aufblitzen eines falschen Layouts beim ersten Rendern.

useEffect und useLayoutEffect im Code vergleichen

Die beiden Hooks haben identische Signaturen: useLayoutEffect(callback, deps) und useEffect(callback, deps). Der einzige Unterschied besteht im Zeitpunkt, zu dem der Callback ausgeführt wird. Sie können zwischen ihnen mit einer Änderung um ein Wort im Code wechseln. Beginnen Sie mit useEffect und wechseln Sie nur dann zu useLayoutEffect, wenn Sie Flackern bestätigen.

Beide Hooks in einer Komponente kombinieren

Es ist zulässig und üblich, beide Hooks in derselben Komponente für unterschiedliche Belange zu verwenden. Beispielsweise könnte eine Chart-Komponente useLayoutEffect verwenden, um ihre Containerbreite zu messen und die SVG viewBox synchron zu setzen, und anschließend useEffect einsetzen, um die Chartdaten asynchron abzurufen. Jeder Hook übernimmt den Bereich, bei dem der Zeitpunkt entscheidend ist.

Auf Double-Paint testen

Neben dem Paint-Flashing in den DevTools können Sie innerhalb Ihrer Komponente einen Konsolenzähler hinzufügen, um Render-Vorgänge zu zählen. Wenn eine Komponente beim ersten Mount zweimal „render“ protokolliert – einmal mit dem initialen State und einmal mit der korrigierten Messung –, liegt ein Double-Paint-Szenario vor. Wenn Sie die Messung nach useLayoutEffect verschieben, sollte nach dem Mount nur noch ein protokolliertes Rendern übrig bleiben (abgesehen vom doppelten Rendern im Strict Mode).

Wann useLayoutEffect gegenüber useEffect bevorzugt werden sollte

Welches Szenario ist der richtige Grund, useLayoutEffect statt useEffect zu verwenden?

Lektion zusammengefasst: Layout Thrashing und visuelles Flackern

Layout Thrashing entsteht durch das abwechselnde Lesen und Schreiben des DOM. Das Batching von React verhindert den größten Teil davon innerhalb von Render-Vorgängen. Flackern tritt auf, wenn useEffect das DOM misst und den State aktualisiert, wodurch zwei Paints entstehen. Beheben Sie Flackern, indem Sie DOM-Messungen nach useLayoutEffect verschieben. Verwenden Sie standardmäßig useEffect für alles andere: Datenabrufe, Abonnements, Logging und Timer.

Häufig gestellte Fragen

Ist die Lektion „Layout-Thrashing und visuelles Flackern vermeiden“ kostenlos?

Ja — der vollständige Text von „Layout-Thrashing und visuelles Flackern vermeiden“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Layout-Thrashing und visuelles Flackern vermeiden“?

Erkennen, wann useEffect sichtbares Flackern verursacht, und das Problem durch useLayoutEffect beheben Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um React Academy zu starten?

Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Layout-Thrashing und visuelles Flackern vermeiden“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?

Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Die Rendering-Phase und der DOM-Commit
  2. Wann useLayoutEffect im Vergleich zu useEffect ausgeführt wird
  3. DOM-Elemente mit useLayoutEffect messen
  4. Layout-Thrashing und visuelles Flackern vermeiden
← Zurück zu React Academy