Virtuelle Liste ist eine Technologie, die einen Teil der Daten in einer langen Liste entsprechend dem sichtbaren Bereich des Scroll-Container-Elements rendert. Virtuelle Listen sind eine gängige Optimierung für lange Listenszenarien. Schließlich rendern nur wenige Leute Hunderte von Unterelementen in einer Liste. Es ist nur erforderlich, die Elemente im sichtbaren Bereich zu rendern, wenn die Bildlaufleiste horizontal oder vertikal scrollt. Während der Entwicklung aufgetretene Probleme1. Die Bilder in der langen Liste sollten die gleichen Proportionen wie die Originalbilder beibehalten. Wenn die Breite beim vertikalen Scrollen unverändert bleibt, ist die Höhe jedes Bildes dynamisch. Wenn sich die Höhe des Listenelements ändert, wirkt sich dies auf die Positionsinformationen des Listenelements und aller nachfolgenden Listenelemente aus. 2. Die Bildbreite und -höhe können erst ermittelt werden, nachdem das Bild geladen wurde. LösungWir verwenden die Listenkomponente in react-virtualized, dem offiziellen Beispiel importiere React von „react“; importiere ReactDOM von „react-dom“; importiere {List} von „react-virtualized“; // Daten als Array von Zeichenfolgen auflisten Konstante Liste = [ „Brian Vaughn“, // Und so weiter... ]; Funktion rowRenderer({ Schlüssel, // Eindeutiger Schlüssel innerhalb des Zeilen-Arrays index, // Index der Zeile innerhalb der Sammlung isScrolling, // Die Liste wird gerade gescrollt isVisible, // Diese Zeile ist in der Liste sichtbar (d. h. es handelt sich nicht um eine überscannte Zeile) Stil, // Stilobjekt, das auf die Zeile angewendet werden soll (um sie zu positionieren) }) { zurückkehren ( <div Schlüssel={Schlüssel} Stil={Stil}> {Liste[Index]} </div> ); } // Rendern Sie Ihre Liste ReactDOM.render( <Liste Breite={300} Höhe={300} Zeilenanzahl={Listenlänge} Zeilenhöhe={20} rowRenderer={rowRenderer} />, document.getElementById('Beispiel'), ); Wobei rowHeight die Höhe jeder Zeile ist. Sie können eine feste Höhe oder eine Funktion übergeben. Jedes Mal, wenn sich die Höhe eines untergeordneten Elements ändert, muss die Methode recomputeRowHeights aufgerufen werden, um die Zeilenhöhe und den Versatz nach Angabe des Index neu zu berechnen. Konkrete Umsetzungconst ImgHeightComponent = ({ imgUrl, onHeightReady, Höhe, Breite }) => { const [Stil, setzeStil] = useState({ Höhe, Breite, Anzeige: "Block", }) const getImgWithAndHeight = (url) => { returniere neues Promise((lösen, ablehnen) => { var img = neues Bild() // Ändere die Quelle des Bildes img.src = URL lass set = null const onload = () => { wenn (Bildbreite || Bildhöhe) { //Bildladen abgeschlossen clearInterval(set) auflösen({ Breite: Bildbreite, Höhe: Bildhöhe }) } } setze = setzeIntervall(beim Laden, 40) }) } useEffect(() => { getImgWithAndHeight(imgUrl).then((Größe) => { const currentHeight = Größe.Höhe * (Breite / Größe.Breite) setzeStil({ Höhe: aktuelle Höhe, Breite: Breite, Anzeige: "Block", }) beiHöheBereit(aktuelleHöhe) }) }, []) zurück <img src={imgUrl} alt='' style={style} /> } Schreiben Sie zunächst eine Komponente zum Abrufen der Bildhöhe, ermitteln und berechnen Sie die Höhe durch eine zeitgesteuerte Schleifenerkennung und übergeben Sie sie an die übergeordnete Komponente. importiere React, { useState, useEffect, useRef } von 'react' Stile aus „./index.scss“ importieren importiere { AutoSizer } von 'react-virtualized/dist/commonjs/AutoSizer' importiere {Liste} aus 'react-virtualized/dist/commonjs/List' exportiere Standardklasse DocumentStudy erweitert React.Component { Konstruktor(Requisiten) { super(Requisiten) dieser.Zustand = { Liste: [], Höhen: [], autoWidth:900, automatische Höhe: 300 } } handleHeightReady = (Höhe, Index) => { dies.setState( (Zustand) => { const flag = Zustand.Höhen.some((Element) => Element.Index === Index) wenn (!flag) { zurückkehren { Höhen: [ ...Staatshöhen, { Index, Höhe, }, ], } } zurückkehren { Höhen: Zustandshöhen, } }, () => { diese.listRef.recomputeRowHeights(index) }, ) } getRowHeight = ({ index }) => { const Zeile = dieser.Zustand.Höhen.find((Element) => Element.Index === Index) Zeile zurückgeben? Zeilenhöhe: this.state.autoHeight } renderItem = ({ Index, Schlüssel, Stil }) => { const { Liste, automatische Breite, automatische Höhe } = dieser.Zustand wenn (dieser.Zustand.Höhen.find((Element) => Element.Index === Index)) { zurückkehren ( <div Schlüssel={Schlüssel} Stil={Stil}> <img src={list[index].imgUrl} alt='' style={{width: '100%'}}/> </div> ) } zurückkehren ( <div Schlüssel={Schlüssel} Stil={Stil}> <Bildhöhenkomponente imgUrl={Liste[index].imgUrl} Breite = {autoWidth} Höhe = {autoHeight} onHeightReady={(Höhe) => { this.handleHeightReady(Höhe, Index) }} /> </div> ) } rendern() { const { list } = dieser.Zustand zurückkehren ( <> <div Stil={{ Höhe: 1000 }}> <AutoSizer> {({ Breite, Höhe }) => ( <Liste ref={(ref) => (diese.listRef = ref)} Breite={Breite} Höhe={Höhe} overscanRowCount={10} Zeilenanzahl={Listenlänge} rowRenderer={dieses.renderItem} Zeilenhöhe={this.getRowHeight} /> )} </AutoSizer> </div> </> ) } } Die übergeordnete Komponente erfasst die Höhen aller Bilder über die Methode handleHeightReady und ruft bei jeder Änderung der Höhe die Methode recomputeRowHeights der List-Komponente auf, um die Komponente zu benachrichtigen, dass Höhe und Versatz neu berechnet werden sollen. Zu diesem Zeitpunkt sind die aufgetretenen Probleme im Wesentlichen gelöst. Tatsächliche Ergebnisse ZusammenfassungDerzeit verwenden wir nur react-virtualized, um die lange Liste von Bildern zu implementieren. Die spezifische interne Implementierung von react-virtualized muss noch weiter untersucht werden. Oben sind die Details zur Verwendung von React-Virtualized zur Implementierung einer langen Liste dynamischer Bilder aufgeführt. Weitere Informationen zu React-Virtualized-Langlisten finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Entpackte Version der MySQL-Installation und aufgetretene Fehler und Lösungen
>>: Ausführliche Erläuterung des Prinzips des MySQL Innodb-Index
Inhaltsverzeichnis 1. Schlüsselwörter 2. Dekonstr...
Vorwort Ich glaube, dass jeder in seiner tägliche...
Einführung Kennen Sie wirklich den Unterschied zw...
Skriptanforderungen: Sichern Sie die MySQL-Datenb...
Neuling, nimm es selbst auf 1. Supervisor install...
Vorwort: MySQL ist ein relationales Datenbankverw...
TabIndex dient zum Drücken der Tabulatortaste, um ...
1. useState: Funktionskomponenten Status geben An...
Die verschiedenen HTML-Dokumente der Website sind...
Um die Tabelle zu verschönern, können Sie für die...
Inhaltsverzeichnis MySQL-Client/Server-Protokoll ...
1. BIOS überprüfen Überprüfen Sie zunächst, in we...
Inhaltsverzeichnis 1. Übersicht 1. Aussagetest er...
Inhaltsverzeichnis Vorwort Warum Unit-Tests einfü...
In diesem Artikel erfahren Sie, wie Sie Python3.6...