Layoutin thrash-ilmiön ja visuaalisen välkkymisen välttäminen
Tunnistakaa, milloin useEffect aiheuttaa näkyvää välkkymistä, ja korjatkaa se korvaamalla se useLayoutEffectillä
Layoutin thrash-ilmiön ja visuaalisen välkkymisen välttäminen on ilmainen React Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu React Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. React Academy-kurssilla on yhteensä 4 oppituntia.
Mitä layout thrash tarkoittaa
Layout thrash tapahtuu, kun JavaScript vuorottelee DOM-ominaisuuksien lukemisen ja DOM:iin kirjoittamisen välillä silmukassa. Jokainen kirjoituksen jälkeinen luku pakottaa selaimen laskemaan layoutin synkronisesti uudelleen tarkan arvon palauttamiseksi. Tämä voi muuttaa yhden layout-laskennan kymmeniksi laskennoiksi ja heikentää suorituskykyä huomattavasti.
Miten Reactin päivitysten niputtaminen auttaa
React niputtaa kaikki setState-kutsut tapahtumakäsittelijöiden ja efektien sisällä yhdeksi uudelleenrenderöinniksi. Tämä automaattinen niputus estää yhden renderöintisyklin sisäisen luku–kirjoitus–luku-mallin, joka aiheuttaa layout thrashin. React 18:ssa niputus ulottuu myös asynkronisiin takaisinsoittoihin ja Promise-olioihin, mikä vähentää samanaikaisten tilapäivitysten aiheuttamaa layout thrashia.
Kun useEffect aiheuttaa välkyntää
Välkyntää ilmenee, kun useEffect lukee DOM:n, päivittää tilaa, käynnistää uudelleenrenderöinnin ja selain piirtää näkymän kahdesti: kerran alkutilalla ja kerran korjatulla tilalla. Ensimmäinen piirtokerta näkyy hetken ennen kuin se korvautuu. Tämä näkyy selvimmin efekteissä, jotka muuttavat asettelun ominaisuuksia, kuten korkeutta, leveyttä tai sijaintia.
Välkynnän selvittäminen DevToolsilla
Avatkaa Chrome DevTools, siirtykää Rendering-välilehdelle (More tools -valikon kolmen pisteen valikon kautta) ja ottakaa käyttöön "Paint flashing". Uudelleenpiirrettävät alueet korostetaan vihreällä. Jos näette komponentin välähtävän ensimmäisellä renderöintikerralla ja piirtyvän heti uudelleen erilaiseen asetteluun, tämä vahvistaa, että useEffect-ohjattu tilapäivitys aiheuttaa kaksi piirtokertaa.
Välkynnän korjaaminen siirtämällä logiikka useLayoutEffectiin
Siirtäkää DOM:n lukeminen ja siitä seuraavat tilapäivitykset useEffect-hookista useLayoutEffect-hookiin. Sama mittaus ja tilapäivitys tehdään nyt synkronisesti ennen piirtokertaa, React renderöi uudelleen ja tekee commitin saman käsittelyjakson aikana, ja selain piirtää vain lopullisen, oikean tilan. Vihreä välkyntä DevToolsissa katoaa.
Yhden piirtokerran malli
Välkkymätön toimintamalli on seuraava: lukekaa DOM useLayoutEffect-hookissa, kutsukaa setState-funktiota mittaustuloksella, React renderöi uudelleen synkronisesti, tekee korjatun DOM:n commitin, ja selain piirtää näkymän kerran lopullisella tuloksella. Tämä on vakiintunut toimintamalli työkaluvihjeiden sijoitteluun, kiinnitettyjen otsakkeiden siirtymiin ja animaatioiden alustamiseen.
Sopivat useEffect-käyttötapaukset
Valtaosa efekteistä kuuluu useEffect-hookiin: tietojen hakeminen (latauksen aikainen välähdys on hyväksyttävä ja odotettu), tapahtumien tai streamien tilaukset, lokitus ja analytiikka, ajastimet sekä kaikki efektit, jotka eivät vaikuta välittömästi näkyvään asetteluun. useLayoutEffect-hookin liiallinen käyttö tilanteissa, joissa useEffect riittäisi, on anti-pattern, joka heikentää suorituskykyä.
Sopivat useLayoutEffect-käyttötapaukset
Varatkaa useLayoutEffect DOM-mittauksiin, jotka vaikuttavat visuaaliseen tulokseen: työkaluvihjeiden sijainteihin, elementin kokoon perustuvaan logiikkaan, vierityssijainnin palauttamiseen sekä animaatioiden alustamiseen, kun alustavat mitat luetaan. Selkeä merkki hookin vaihtamiseen on näkyvä yhden ruudun mittainen väärän asettelun välähdys ensimmäisellä renderöintikerralla.
useEffectin ja useLayoutEffectin vertailu koodissa
Kahdella hookilla on identtiset allekirjoitukset: useLayoutEffect(callback, deps) ja useEffect(callback, deps). Ainoa ero on callback-funktion suoritusajankohta. Voitte vaihtaa hookien välillä muuttamalla koodissa yhden sanan. Aloittakaa useEffect-hookilla ja vaihtakaa useLayoutEffect-hookiin vain, jos varmistatte välkynnän esiintymisen.
Molempien käyttö samassa komponentissa
On täysin sallittua ja tavallista käyttää molempia hookeja samassa komponentissa eri tarkoituksiin. Esimerkiksi kaaviokomponentti voi käyttää useLayoutEffect-hookia säilönsä leveyden mittaamiseen ja SVG:n viewBoxin synkroniseen asettamiseen ja käyttää sen jälkeen useEffect-hookia kaavion tietojen asynkroniseen hakemiseen. Kumpikin hook käsittelee tarkoitusta, jossa ajoituksella on merkitystä.
Kahden piirtokerran testaaminen
DevToolsin paint flashing -toiminnon lisäksi voitte laskea renderöintikerrat lisäämällä komponenttiin konsolilaskurin. Jos komponentti tulostaa "render" ensimmäisellä liittämiskerralla kaksi kertaa — kerran alkutilalla ja kerran korjatulla mittaustuloksella — kyseessä on kahden piirtokerran tilanne. Kun mittaus siirretään useLayoutEffect-hookiin, lokiin pitäisi liittämisen jälkeen tulla vain yksi renderöinti (Strict Moden aiheuttamaa kaksinkertaista suoritusta lukuun ottamatta).
Milloin useLayoutEffectiä kannattaa käyttää useEffectin sijaan
Mikä seuraavista tilanteista on oikea syy käyttää useLayoutEffect-hookia useEffect-hookin sijaan?
Oppitunnin kertaus: layout thrash ja visuaalinen välkyntä
Layout thrash syntyy, kun DOM:ia luetaan ja kirjoitetaan vuorotellen. Reactin batching estää suurimman osan siitä renderöintien aikana. Välkyntää ilmenee, kun useEffect mittaa DOM:n ja päivittää tilaa, mikä aiheuttaa kaksi piirtokertaa. Korjatkaa välkyntä siirtämällä DOM-mittaukset useLayoutEffect-hookiin. Käyttäkää oletuksena useEffect-hookia kaikkeen muuhun: tietojen hakemiseen, tilauksiin, lokitukseen ja ajastimiin.
Opi React tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 88
- Oppitunnit
- 324
Usein kysytyt kysymykset
Onko oppitunti ”Layoutin thrash-ilmiön ja visuaalisen välkkymisen välttäminen” ilmainen?
Kyllä – oppitunnin ”Layoutin thrash-ilmiön ja visuaalisen välkkymisen välttäminen” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko React Academy-kurssin, päivitä CoddyKit PROhon. React Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Layoutin thrash-ilmiön ja visuaalisen välkkymisen välttäminen”?
Tunnistakaa, milloin useEffect aiheuttaa näkyvää välkkymistä, ja korjatkaa se korvaamalla se useLayoutEffectillä Harjoittelet React Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni React Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin React Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Layoutin thrash-ilmiön ja visuaalisen välkkymisen välttäminen”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä React Academy-oppitunnilla?
Kyllä. Jokainen React Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Renderöintivaihe ja DOM:n commit
- Milloin useLayoutEffect suoritetaan verrattuna useEffectiin
- DOM-elementtien mittaaminen useLayoutEffectillä
- Layoutin thrash-ilmiön ja visuaalisen välkkymisen välttäminen