DOM-Elemente mit useLayoutEffect messen
Abmessungen, Positionen und Scroll-Offsets von Elementen nach dem Layout, aber vor dem Zeichnen auslesen, um Flackern zu vermeiden
DOM-Elemente mit useLayoutEffect messen ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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.
Überblick über getBoundingClientRect
element.getBoundingClientRect() gibt ein DOMRect-Objekt mit der Größe und Position des Elements relativ zum Viewport zurück: top, right, bottom, left, width und height. Dafür muss der Browser eine Layout-Berechnung durchführen, rufen Sie die Methode daher sparsam auf.
Das Problem beim Lesen in useEffect
Wenn Sie getBoundingClientRect() in einem useEffect lesen, hat der Browser bereits gepaintet. Wenn Sie den Zustand anschließend auf Grundlage der Messung setzen, rendert React erneut und der Browser paintet nochmals. Benutzer sehen das Element möglicherweise kurz an der falschen Position oder mit der falschen Größe, bevor die Korrektur im zweiten Paint erscheint.
Warum useLayoutEffect dieses Problem löst
Das Lesen von Messwerten in useLayoutEffect erfolgt nach den DOM-Mutationen, aber vor dem Paint. Jede durch die Messung ausgelöste Zustandsaktualisierung veranlasst React, synchron erneut zu rendern und das korrigierte DOM zu committen – und zwar bevor der Browser irgendetwas gepaintet hat. Benutzer sehen in einem einzigen Paint-Zyklus nur das endgültige, korrekte Ergebnis.
Positionierung von Tooltips
Ein Tooltip muss in der Nähe seines auslösenden Elements erscheinen. Messen Sie die Position des auslösenden Elements in useLayoutEffect mit getBoundingClientRect(), berechnen Sie die absolute Position des Tooltips und speichern Sie diese Position im Zustand. Der Tooltip wird bereits beim allerersten Paint an der richtigen Stelle gerendert, ohne sichtbares Springen von einer falschen Ausgangsposition.
Elementanimation: Ausgangsgröße lesen
Um ein Element von seiner natürlichen (uneingeschränkten) Größe auf eine feste Größe zu animieren, müssen Sie die natürliche Größe kennen, bevor Sie die Einschränkung anwenden. Lesen Sie die Höhe des Elements in useLayoutEffect, bevor ein Animationsstil angewendet wird, speichern Sie sie im Zustand und verwenden Sie sie anschließend als Startwert des Keyframes für Ihre CSS-Transition.
Höhe des Sticky-Headers
Wenn eine Seite einen Sticky-Header hat, benötigt der Inhaltsbereich ein oberes Padding in Höhe des Headers, damit er nicht dahinter verborgen wird. Messen Sie die Höhe des Headers in useLayoutEffect mithilfe einer Ref: headerRef.current.getBoundingClientRect().height. Setzen Sie diesen Wert als paddingTop für den Inhaltscontainer. Das Layout ist bereits beim ersten Render-Vorgang korrekt.
Zustandsaktualisierung verursacht synchronen erneuten Render-Vorgang
Wenn Sie setState innerhalb von useLayoutEffect aufrufen, führt React im selben synchronen Arbeitsblock sofort einen weiteren Render- und Commit-Zyklus aus. Bei diesem erneuten Render-Vorgang wird auch der useLayoutEffect erneut ausgeführt. Achten Sie darauf, keine Endlosschleife zu erzeugen: Aktualisieren Sie den Zustand nur, wenn sich der neue Messwert vom aktuellen Zustandswert unterscheidet.
SSR: Messungen liefern null
Auf dem Server existieren DOM-Elemente nicht, daher würde getBoundingClientRect() einen Fehler auslösen oder Nullen zurückgeben. Sichern Sie Ihren useLayoutEffect mit einer Prüfung ab: if (typeof window === 'undefined') return;. Bei SSR-Anwendungen müssen Sie möglicherweise mit einer Platzhaltergröße hydratisieren und die Messung nach der Hydration auf dem Client durchführen.
ResizeObserver für fortlaufende Überwachung
Eine einmalige Messung mit useLayoutEffect liefert die Größe zum Zeitpunkt des Mountens. Um Größenänderungen zu verfolgen, während sich das Element verändert (durch eine Größenänderung des Fensters, dynamische Inhalte oder CSS-Änderungen), verwenden Sie stattdessen ResizeObserver. Er ruft eine Callback-Funktion auf, sobald sich die Größe des Elements ändert, und eignet sich daher besser für responsive Komponenten.
Redundante Messungen vermeiden
Wenn mehrere Effects dieselbe Messung benötigen, berechnen Sie sie einmal und teilen Sie sie über Context oder durch Weitergabe als Props. Wenn derselbe Wert von getBoundingClientRect() in mehreren useLayoutEffect-Aufrufen berechnet wird, löst dies mehrere synchrone Layout-Lesevorgänge aus, von denen jeder relativ aufwendig ist. Fassen Sie Messungen nach Möglichkeit zusammen.
Timing von Refs mit useLayoutEffect
Refs werden befüllt, bevor Effects ausgeführt werden. Wenn useLayoutEffect ausgeführt wird, zeigt ref.current garantiert auf das DOM-Element. Deshalb funktioniert dieses Muster: useLayoutEffect(() => { const rect = ref.current.getBoundingClientRect(); ... }, []). Bei einer gemounteten Komponente ist die Ref innerhalb eines Layout-Effects niemals null.
Timing von getBoundingClientRect
Warum ist es besser, getBoundingClientRect() in useLayoutEffect statt in useEffect aufzurufen?
Zusammenfassung: DOM-Elemente messen
Verwenden Sie getBoundingClientRect() in useLayoutEffect, um DOM-Messwerte nach den Mutationen, aber vor dem Paint zu lesen. Zustandsaktualisierungen aufgrund dieser Messungen führen zu einem synchronen erneuten Render-Vorgang, der in denselben Paint einbezogen wird und Flackern verhindert. Sichern Sie SSR mit einer typeof window-Prüfung ab. Für die fortlaufende Größenüberwachung sollten Sie ResizeObserver bevorzugen.
Häufig gestellte Fragen
Ist die Lektion „DOM-Elemente mit useLayoutEffect messen“ kostenlos?
Ja — der vollständige Text von „DOM-Elemente mit useLayoutEffect messen“ 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 „DOM-Elemente mit useLayoutEffect messen“?
Abmessungen, Positionen und Scroll-Offsets von Elementen nach dem Layout, aber vor dem Zeichnen auslesen, um Flackern zu vermeiden 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 3 von 4.
Wie lange dauert die Lektion „DOM-Elemente mit useLayoutEffect messen“?
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
- Die Rendering-Phase und der DOM-Commit
- Wann useLayoutEffect im Vergleich zu useEffect ausgeführt wird
- DOM-Elemente mit useLayoutEffect messen
- Layout-Thrashing und visuelles Flackern vermeiden