VariableSizeList: dynamiska radhöjder
Hantera objekt med olika höjd med VariableSizeList och mönstret med callbacken itemSize.
VariableSizeList: dynamiska radhöjder ä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.
När objekten har olika höjd
Ibland är raderna inte enhetliga: en chattlista kan blanda korta och långa meddelanden, eller ett flöde kan innehålla kort med varierande innehåll. FixedSizeList kan inte hantera detta eftersom den förutsätter ett konstant itemSize.
För sådana fall erbjuder react-window en listtyp där varje objekt kan ange sin egen storlek.
VariableSizeList ersätter FixedSizeList
VariableSizeList fungerar som FixedSizeList men accepterar en storlek per objekt. Du importerar den i stället och anger en funktion som returnerar storleken för ett givet index.
Allt annat, renderfunktionen children och den kritiska proppen style, förblir detsamma, så migreringen blir liten.
itemSize som funktion
Med VariableSizeList är itemSize en funktion som tar ett index och returnerar radens höjd i pixlar. react-window anropar den för att beräkna förskjutningar och avgöra det synliga fönstret.
Det gör att du kan ange kända höjder, till exempel högre rader för objekt med bilder och kortare rader för vanlig text.
Förberäkna eller mäta
Om du känner till varje rads höjd i förväg kan du returnera den direkt från funktionen itemSize. Om höjderna beror på det renderade innehållet måste du mäta raderna efter att de har ritats upp.
Förberäknade höjder är enklast och snabbast. Uppmätta höjder är mer flexibla, men kräver extra arbete för att skicka tillbaka storlekarna till listan.
resetAfterIndex efter mätning
VariableSizeList cachar objektens förskjutningar. När en uppmätt höjd ändras måste du anropa listans resetAfterIndex-metod via dess ref så att positionerna beräknas om från och med det indexet.
Om du glömmer detta blir förskjutningarna inaktuella och raderna feljusterade, så resetAfterIndex är nyckeln till att få dynamisk mätning att fungera.
Moment 22 med höjden
Det uppstår ett moment 22: du behöver en höjd för att kunna rendera raden, men den verkliga höjden känner du först till efter att raden har renderats. Listan måste placera raden innan den kan mätas.
För att lösa detta renderar du först med en uppskattning och korrigerar sedan när den riktiga höjden är känd.
Uppskatta, rendera, mät och uppdatera
Det vanliga mönstret är att rendera raderna med en uppskattad höjd, mäta deras faktiska höjd efter att de har ritats upp med hjälp av en ref eller ResizeObserver, spara det uppmätta värdet och anropa resetAfterIndex för att uppdatera positionerna.
Den här loopen konvergerar snabbt, så listan stabiliseras med korrekta förskjutningar efter den första mätningen.
getItemSize måste vara stabil
Funktionen itemSize bör vara stabil mellan renderingar, vanligtvis genom att omslutas av useCallback, så att listan inte hela tiden ogiltigförklarar sina cachade förskjutningar.
En instabil funktion som definieras inline kan tvinga fram onödiga omberäkningar och försämra den prestanda som virtualiseringen är avsedd att ge.
Prestandaavvägningen
VariableSizeList gör mer arbete än FixedSizeList eftersom den inte kan förutsätta en konstant offset och måste hålla reda på storleken för varje objekt. När höjderna mäts medför den extra mätningen också en kostnad.
För listor där raderna faktiskt varierar är den här kostnaden värd det; för enhetliga rader är FixedSizeList fortfarande det snabbare och enklare valet.
Att använda fast storlek med approximation
Om exakt dynamisk mätning blir för kostsam kan du ibland göra en uppskattning. Genom att dela in rader i ett fåtal fasta höjdklasser, eller använda ett rimligt genomsnitt, kan du fortsätta använda FixedSizeList.
Detta byter pixelperfekt layout mot enkelhet och snabbhet – en acceptabel kompromiss när mindre avvikelser i offset är tolererbara.
Snabbtest: VariableSizeList itemSize
Kom ihåg hur VariableSizeList lär sig höjden på varje rad.
Sammanfattning: VariableSizeList
VariableSizeList hanterar rader med olika höjd genom att ta itemSize som en funktion av index. Höjder kan beräknas i förväg eller mätas; uppmätta höjder kräver loopen uppskatta–rendera–mäta–uppdatera med resetAfterIndex.
Håll itemSize-funktionen stabil med useCallback. Den kostar mer än FixedSizeList, så för enhetliga rader eller när en approximation räcker bör du föredra den fasta varianten.
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 ”VariableSizeList: dynamiska radhöjder” gratis?
Ja – hela texten till ”VariableSizeList: dynamiska radhöjder” 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 ”VariableSizeList: dynamiska radhöjder”?
Hantera objekt med olika höjd med VariableSizeList och mönstret med callbacken itemSize. 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 ”VariableSizeList: dynamiska radhöjder”?
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
- Problemet med rendering av stora listor
- FixedSizeList: rendera tusentals objekt
- VariableSizeList: dynamiska radhöjder
- Kombinera virtualisering med datahämtning