React Academy · Lektion

Använd useLayoutEffect för mätningar före animering

Använd useLayoutEffect för att mäta elementets dimensioner innan animeringar börjar, så att layoutförskjutningar undviks.

Lektion 3 av 413 steg

Använd useLayoutEffect för mätningar före animering är en gratis lektion i React Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för React Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i React Academy innehåller totalt 4 lektioner.

Problemet med flimret

Ibland hoppar eller flimrar ett element synligt vid den första renderingen innan det hamnar på rätt plats. Det händer vanligtvis när Ni mäter eller flyttar ett element efter att webbläsaren redan har målat det.

Användaren ser fel position under en bildruta och därefter en plötslig korrigering, vilket ser trasigt ut.

Varför useEffect orsakar flimret

useEffect körs efter att webbläsaren har målat. Om Ni därför läser av ett mått och uppdaterar DOM-trädet i useEffect har användaren redan sett den okorrigerade bildrutan innan ändringen tillämpas.

För visuell positionering som måste vara osynlig för användaren är tidpunkten efter målningen för sen.

useLayoutEffect körs före målning

useLayoutEffect körs synkront efter att React har ändrat DOM-trädet men innan webbläsaren målar. Alla DOM-avläsningar eller DOM-skrivningar som Ni gör där verkställs innan användaren ser en enda bildruta.

Därför är det rätt verktyg för mått och positionering som måste se korrekta ut direkt.

Mäta den ursprungliga positionen

I useLayoutEffect kan Ni läsa av ett elements layout med ref.current.getBoundingClientRect() för att fånga dess position och storlek innan Ni animerar det.

Eftersom detta körs före målningen kan Ni både mäta och tillämpa en starttransformering utan något synligt flimmer.

FLIP-tekniken

FLIP står för First, Last, Invert, Play. Ni registrerar elementets första position (First), låter det flyttas till sin sista position (Last), inverterar sedan genom att tillämpa en transformering som visuellt placerar det tillbaka vid First och spelar slutligen upp animeringen genom att ta bort transformeringen, så att det animeras till Last.

På så sätt kan Ni animera layoutändringar med endast den billiga egenskapen transform, även om den verkliga layouten ändrades direkt.

getBoundingClientRect i useLayoutEffect

De viktiga avläsningarna görs i useLayoutEffect: fånga First-rektangeln före ändringen och Last-rektangeln efteråt, och beräkna sedan skillnaden. När detta görs före målningen garanteras att den inverterade transformeringen finns på plats innan något visas.

Skillnaden mellan de två rektanglarna ger Er den exakta förflyttningen och skalningen som behövs för inverteringen.

Tillämpa transformeringen synkront

Ni anger den inverterande transformeringen synkront i useLayoutEffect och tar sedan bort den i nästa bildruta, så att elementet animeras till sin naturliga position. Ofta utlöser Ni uppspelningssteget med requestAnimationFrame.

Eftersom inverteringen tillämpades före målningen ser användaren aldrig elementet på sin oförändrade Last-position.

SSR-varningen

På servern finns ingen DOM, så React loggar en varning om att useLayoutEffect inte gör något under serverrendering. Layouteffekter är bara meningsfulla i webbläsaren.

Varningen visar att effekten inte kan köras när det inte finns något att mäta.

SSR-säkert alternativ

Om en komponent måste köras på servern kan Ni använda useEffect tillsammans med requestAnimationFrame för att göra mätningen före nästa målning, eller använda useLayoutEffect villkorligt endast i webbläsaren.

Detta undviker varningen och ger samtidigt nästan samma tidpunkt som före målningen för icke-kritiska animeringar.

Exempel med en expanderbar accordion

En höjdanimering är ett klassiskt fall: mät den hopfällda och den expanderade höjden i useLayoutEffect och animera sedan mellan uttryckliga pixelvärden så att övergången blir mjuk.

Eftersom höjden auto inte kan animeras kan Ni genom att först mäta den verkliga höjden övergå till ett konkret tal.

När ska Ni använda useLayoutEffect

Använd som standard useEffect för det mesta. Använd useLayoutEffect endast när Ni läser av layouten och måste ändra DOM-trädet före målningen för att undvika ett synligt flimmer.

Överanvändning kan försämra prestandan eftersom målningen blockeras tills effekten är klar.

Snabbtest

Testa hur väl Ni förstår när effekter körs.

Sammanfattning

Ni har lärt Er att flimret orsakas av mätning efter målningen, att useLayoutEffect körs före målningen och hur FLIP-tekniken animerar layoutändringar med billiga transformeringar.

Ni har också sett SSR-varningen och ett alternativ med useEffect plus requestAnimationFrame.

Gratis att börja

Lär dig React med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
88
Lektioner
324

Vanliga frågor

Är lektionen ”Använd useLayoutEffect för mätningar före animering” gratis?

Ja – hela texten till ”Använd useLayoutEffect för mätningar före animering” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i React Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i React Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Använd useLayoutEffect för mätningar före animering”?

Använd useLayoutEffect för att mäta elementets dimensioner innan animeringar börjar, så att layoutförskjutningar undviks. Ni övar på React Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig React Academy?

Du behöver inga förkunskaper. Utbildningen i React Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Använd useLayoutEffect för mätningar före animering”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här React Academy-lektionen?

Ja. Varje React Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. CSS-övergångar vid ändringar i React-state
  2. CSS-nyckelbildsanimationer med React
  3. Använd useLayoutEffect för mätningar före animering
  4. In- och utgångsanimeringar utan bibliotek
← Tillbaka till React Academy