React Academy · Lektion

Brug af useLayoutEffect til målinger før animation

Brug useLayoutEffect til at måle elementers dimensioner, før animationer begynder, så layoutforskydninger undgås.

Lektion 3 af 413 trin

Brug af useLayoutEffect til målinger før animation er en gratis React Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i React Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. React Academy-kurset indeholder 4 lektioner i alt.

Problemet med det første blink

Nogle gange springer eller flimrer et element synligt ved den første gengivelse, før det falder på plads. Det sker som regel, når du måler eller flytter et element, efter at browseren allerede har gengivet det.

Brugeren ser den forkerte position i ét billede og derefter en pludselig rettelse, hvilket ser ødelagt ud.

Hvorfor useEffect forårsager blinket

useEffect kører, efter browseren har gengivet siden. Hvis du derfor aflæser en måling og opdaterer DOM'en inde i useEffect, har brugeren allerede set det ukorrigerede billede, før din ændring anvendes.

Ved visuel placering, der skal være usynlig for brugeren, er timing efter gengivelsen for sen.

useLayoutEffect kører før gengivelsen

useLayoutEffect kører synkront, efter at React har ændret DOM'en, men før browseren gengiver den. Enhver DOM-læsning eller -skrivning, du foretager dér, gennemføres, før brugeren ser et eneste billede.

Det gør den til det rigtige værktøj til målinger og placering, der skal se korrekte ud med det samme.

Måling af startpositionen

Inde i useLayoutEffect kan du aflæse et elements layout med ref.current.getBoundingClientRect() for at registrere dets position og størrelse, før du animerer.

Fordi dette kører før gengivelsen, kan du både måle og anvende en starttransformation uden et synligt blink.

FLIP-teknikken

FLIP står for First, Last, Invert, Play. Du registrerer elementets første position, lader det flytte sig til sin sidste position, inverterer derefter ved at anvende en transformation, der visuelt placerer det tilbage ved den første position, og afspiller til sidst animationen ved at fjerne transformationen, så det animeres til den sidste position.

Det gør det muligt at animere layoutændringer med kun den billige transform, selvom det faktiske layout sprang øjeblikkeligt.

getBoundingClientRect i useLayoutEffect

De vigtige aflæsninger sker i useLayoutEffect: registrer det første rektangel før ændringen og det sidste rektangel efter ændringen, og beregn derefter forskellen. Når du gør dette før gengivelsen, er den inverterende transformation på plads, før noget bliver vist.

Forskellen mellem de to rektangler giver dig den præcise forskydning og skalering, der skal til for at invertere ændringen.

Synkron anvendelse af transformationen

Du angiver den inverterende transformation synkront inde i useLayoutEffect og fjerner den derefter i det næste billede, så elementet animeres til sin naturlige placering. Ofte udløser du afspilningstrinnet med requestAnimationFrame.

Fordi inverteringen blev anvendt før gengivelsen, ser brugeren aldrig elementet på dets rå sidste position.

SSR-advarslen

På serveren findes der ingen DOM, så React logger en advarsel om, at useLayoutEffect ikke gør noget under servergengivelse. Layout-effekter giver kun mening i browseren.

Denne advarsel viser, at effekten ikke kan køre et sted, hvor der ikke er noget at måle.

SSR-sikkert alternativ

Hvis en komponent skal køre på serveren, kan du bruge useEffect sammen med requestAnimationFrame til at udføre målingen før den næste gengivelse eller kun bruge useLayoutEffect betinget i browseren.

Det undgår advarslen, samtidig med at du opnår timing tæt på før-gengivelsen for ikke-kritiske animationer.

Eksempel med udfoldning af en harmonika

En højdeanimation er et klassisk eksempel: Mål den sammenklappede og udfoldede højde i useLayoutEffect, og animer derefter mellem konkrete pixelværdier, så overgangen bliver jævn.

Fordi højden auto ikke kan animeres, kan du ved først at måle den faktiske højde lave en overgang til et konkret tal.

Hvornår skal du bruge useLayoutEffect

Brug som standard useEffect til det meste. Brug kun useLayoutEffect, når du aflæser layout og skal ændre DOM'en før gengivelsen for at undgå et synligt blink.

Overdreven brug kan skade ydeevnen, fordi den blokerer gengivelsen, indtil den er færdig.

Hurtig kontrol

Test din forståelse af timing for effekter.

Opsummering

Du har lært, at problemet med blink skyldes måling efter gengivelsen, at useLayoutEffect kører før gengivelsen, og hvordan FLIP-teknikken animerer layoutændringer med billige transformationer.

Du har også set SSR-advarslen og en fallback med useEffect plus requestAnimationFrame.

Gratis at komme i gang

Lær React med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
88
Lektioner
324

Ofte stillede spørgsmål

Er lektionen “Brug af useLayoutEffect til målinger før animation” gratis?

Ja — hele teksten til “Brug af useLayoutEffect til målinger før animation” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af React Academy-kurset, skal du opgradere til CoddyKit PRO. React Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Brug af useLayoutEffect til målinger før animation”?

Brug useLayoutEffect til at måle elementers dimensioner, før animationer begynder, så layoutforskydninger undgås. Du øver dig i React Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på React Academy?

Der kræves ingen tidligere erfaring. React Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Brug af useLayoutEffect til målinger før animation”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne React Academy-lektion?

Ja. Alle React Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. CSS-overgange ved ændringer i React-state
  2. CSS-keyframe-animationer med React
  3. Brug af useLayoutEffect til målinger før animation
  4. Ind- og udgangsanimationer uden et bibliotek
← Tilbage til React Academy