Hirefullstack – Software Engineering & IT-Beratung aus Berlin
← Zur Übersicht
Fortgeschritten 8 Min Lesezeit

useLayoutEffect & useInsertionEffect

Messen und korrigieren, bevor der Browser malt

Baut auf: useEffect
In einem Satz

Fast wie useEffect – läuft aber schon, bevor der Browser das Bild anzeigt. Damit verhinderst du sichtbares Zucken.

Diesen Hook brauchst du selten. Er ist für genau einen Fall da: Du musst etwas ausmessen und daraufhin sofort die Position ändern – und der Nutzer soll den Zwischenschritt nicht sehen.

zeitpunkte.txt
Zeichnen  →  Seite anpassen  →  useLayoutEffect  →  Browser zeigt an  →  useEffect
                                 ▲ hier wartet der Browser        ▲ hier nicht mehr

Beide Hooks schreibst du völlig gleich. Der einzige Unterschied ist der Zeitpunkt – und der entscheidet, ob man einen Zwischenzustand aufblitzen sieht.

Bildlich gesprochen

useEffect ist „Bild ist im Rahmen, jetzt noch schnell den Rahmen geradeziehen“ – man sieht es kurz schief hängen. useLayoutEffect richtet den Rahmen, bevor der Vorhang aufgeht.

Der typische Fall: messen und positionieren

tooltip.tsx
function Tooltip({ ziel, children }) {
  const ref = useRef<HTMLDivElement>(null);
  const [oben, setOben] = useState(0);

  useLayoutEffect(() => {
    const hoehe = ref.current!.getBoundingClientRect().height;
    const platz = ziel.getBoundingClientRect().top;
    setOben(platz < hoehe ? platz + 20 : platz - hoehe);   // unten statt oben
  }, [ziel]);

  return <div ref={ref} style={{ top: oben }}>{children}</div>;
}
Mit useEffect würde der Tooltip erst an der falschen Stelle erscheinen und dann springen.
Nimm es, wenn …
  • +

    DOM messen und daraufhin sofort Position/Größe korrigieren (Tooltips, Popover, Dropdowns)

  • +

    Scrollposition setzen, bevor der Nutzer den Sprung sieht

  • +

    Ein Flackern, das du im Browser tatsächlich beobachtest

Lass es, wenn …
  • Alles andere – useEffect ist der Standard

  • Datenladen, Abos, Timer

  • Server-Rendering: useLayoutEffect läuft dort nicht und warnt in der Konsole

Achtung Der Browser wartet solange

Alles in useLayoutEffect läuft, bevor der Nutzer etwas sieht. Viel Arbeit an dieser Stelle lässt die Seite spürbar hängen. Nimm es nur, wenn du ein Zucken behebst, das du wirklich beobachtet hast.

Genauer erklärt: Server-Rendering und useInsertionEffect optional

Beim Server-Rendering (SSR)Die Seite wird schon auf dem Server als fertiges HTML erzeugt, damit der Browser sofort etwas anzeigen kann. gibt es keine Seite zum Ausmessen – der Hook läuft dort schlicht nicht, und React warnt in der Konsole. Übliche Lösungen: die Komponente nur im Browser zeichnen, oder auf useEffect ausweichen.

Gut zu wissen useInsertionEffect gibt es auch noch

Der läuft noch früher – bevor React überhaupt etwas an der Seite ändert. Er existiert praktisch nur, damit Styling-Bibliotheken ihre <style>-Blöcke einfügen können, ohne Messungen zu verfälschen. In eigenem Code brauchst du ihn nie.

Sitzt das schon?

3 Fragen zu dieser Lektion. Falsche Antworten landen in deiner Statistik.

Hirefullstack

Ihr braucht React-Verstärkung im Team?

Wir bauen seit Jahren React- und Next.js-Anwendungen für Kunden in ganz Deutschland – als einzelner Experte, als Verstärkung fürs Bestandsteam oder als komplettes Scrum-Team.

Projekt besprechen →