Når useLayoutEffect kjører sammenlignet med useEffect
Lær at useLayoutEffect kjører synkront etter DOM-endringer, men før nettleseren tegner siden.
Når useLayoutEffect kjører sammenlignet med useEffect er en gratis leksjon i React Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i React Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i React Academy inneholder totalt 4 leksjoner.
Tidspunkt for useLayoutEffect
useLayoutEffect kjøres synkront umiddelbart etter at React har brukt DOM-mutasjonene, men før nettleseren har fått mulighet til å tegne disse endringene. Fra nettleserens perspektiv er layouteffekten og DOM-mutasjonene del av den samme uavbrutte, synkrone arbeidsblokken.
Tidspunkt for useEffect
useEffect kjøres asynkront etter at nettleseren er ferdig med å tegne. Brukeren ser det oppdaterte brukergrensesnittet først, og deretter kjøres effekten. Dette gjør useEffect mindre forstyrrende for gjengivelsesytelsen, men betyr at synlige endringer som effekten forårsaker, vil føre til en ny tegningssyklus.
Eksperiment med tidsstempler
Du kan bekrefte forskjellen i tidspunkt ved å logge tidsstempler i begge effektene: legg til console.log('layout', Date.now()) i useLayoutEffect og console.log('passive', Date.now()) i useEffect. I konsollen vil tidsstempelet for layouteffekten alltid være tidligere enn tidsstempelet for den passive effekten, noe som bekrefter kjøringsrekkefølgen.
Synlige konsekvenser for brukere
Hvis en useEffect oppdaterer tilstand som påvirker det visuelle resultatet, ser brukeren to gjengivelser: den første gjengivelsen med utdatert tilstand, og deretter den korrigerte gjengivelsen etter at effekten er kjørt. Dette viser seg som et synlig glimt eller en ny layoutberegning. useLayoutEffect forhindrer dette fordi tilstandsoppdateringene committes før nettleseren tegner noe.
Tilstandsoppdatering i useLayoutEffect fører til synkron ny gjengivelse
Hvis du kaller setState i en useLayoutEffect, kjører React umiddelbart en ny gjengivelses- og commit-syklus før tegning. Nettleseren tegner bare det endelige resultatet – brukeren ser aldri mellomtilstanden. Dette er det viktigste bruksområdet for useLayoutEffect: mål DOM-en, beregn en ny verdi, oppdater tilstanden og garanter én ren tegning.
Ytelsesforbehold
Fordi useLayoutEffect kjører synkront før tegning og kan utløse flere gjengivelser, kan overdreven bruk svekke ytelsen. Hvis det synkrone arbeidet er omfattende, blokkerer det nettleseren fra å tegne og fører til synlig hakking. Bruk det bare når du må forhindre et synlig glimt, og bruk useEffect til alt annet.
Dobbel kjøring i Strict Mode
I React Strict Mode (bare i utviklingsmodus) kjøres både useLayoutEffect og useEffect to ganger per montering. Rekkefølgen er: monter, rydd opp, monter på nytt. Dette gjør det enklere å oppdage effekter som ikke rydder opp på riktig måte. Den doble kjøringen skjer ikke i produksjonsbygg.
Ytelsesregel: Velg useEffect som standard
Standardvalget bør alltid være useEffect. Bytt bare til useLayoutEffect når du kan observere og gjenskape et problem med synlig flimring eller feil layout. Overdreven bruk av useLayoutEffect blokkerer nettleserens tegneforløp unødvendig og kan svekke den opplevde ytelsen.
SSR-forbehold: useLayoutEffect på serveren
useLayoutEffect kan ikke kjøres på serveren fordi det ikke finnes noen DOM eller nettleserbasert tegningssyklus i et servermiljø. Hvis den brukes i en komponent som gjengis på serveren, viser React en advarsel. Løsningen er å hoppe over effekten betinget: sjekk typeof window !== 'undefined', eller bytt til useEffect for SSR-kompatibel kode.
Slik avgjør du hvilken du skal bruke
Spør deg selv: "Endrer denne effekten noe som brukeren vil se ved den aller første tegningen?" Hvis svaret er ja, bruker du useLayoutEffect for å forhindre et glimt. Hvis svaret er nei – for datainnhenting, abonnementer, analyse, logging og de fleste andre bivirkninger – bruker du useEffect. Dette beslutningsrammeverket dekker de fleste tilfeller i praksis.
Den synkrone karakteren til useLayoutEffect
useLayoutEffect kjører i den samme synkrone arbeidsblokken som DOM-mutasjonene. React kan ikke behandle annet arbeid (som å svare på brukerhendelser) mens en useLayoutEffect kjører. Derfor må den være rask og målrettet. Langvarig synkron kode i useLayoutEffect forsinker nettleserens visning direkte.
Tidspunkt for useLayoutEffect
Nøyaktig når kjøres useLayoutEffect i forhold til DOM-mutasjoner og nettleserens tegning?
Oppsummering av leksjonen: useLayoutEffect kontra useEffect
useLayoutEffect er synkron og kjøres før nettleseren tegner, noe som gjør den egnet for DOM-måling og visuelle korrigeringer. useEffect kjøres etter tegning og er det riktige valget for datainnhenting, abonnementer og de fleste bivirkninger. Velg useEffect som standard, og bytt bare når visuell flimring bekrefter at useLayoutEffect er nødvendig. Unngå den i SSR uten beskyttelser.
Lær deg React med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 88
- Leksjoner
- 324
Ofte stilte spørsmål
Er leksjonen «Når useLayoutEffect kjører sammenlignet med useEffect» gratis?
Ja – hele teksten i «Når useLayoutEffect kjører sammenlignet med useEffect» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av React Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i React Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Når useLayoutEffect kjører sammenlignet med useEffect»?
Lær at useLayoutEffect kjører synkront etter DOM-endringer, men før nettleseren tegner siden. Du øver på React Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med React Academy?
Ingen tidligere erfaring er nødvendig. React Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Når useLayoutEffect kjører sammenlignet med useEffect»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne React Academy-leksjonen?
Ja. Alle React Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Gjengivelsesfasen og DOM-commit
- Når useLayoutEffect kjører sammenlignet med useEffect
- Måle DOM-elementer med useLayoutEffect
- Unngå layout-kaos og visuell flimring