Verwenden von react-virtualized zum Implementieren einer langen Liste von Bildern mit dynamischer Höhe

Verwenden von react-virtualized zum Implementieren einer langen Liste von Bildern mit dynamischer Höhe

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 Probleme

1. 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ösung

Wir 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 Umsetzung

const 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

Zusammenfassung

Derzeit 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:
  • Beispielanalyse der Verwendung des ScrollView-Komponentenkarussells und der ListView-Rendering-Listenkomponente in React Native
  • Das mobile React-Terminal implementiert den Beispielcode zum Löschen der Liste durch Wischen nach links
  • Beispiel für eine benutzerdefinierte Pulldown-Aktualisierung mit Pullup und geladener Liste in React Native
  • Beispielcode für die indizierte Städtelistenkomponente von React Native
  • React implementiert das Klicken, um das entsprechende Element in der Liste zu löschen

<<:  Entpackte Version der MySQL-Installation und aufgetretene Fehler und Lösungen

>>:  Ausführliche Erläuterung des Prinzips des MySQL Innodb-Index

Artikel empfehlen

Wie melde ich mich per Remote-Zugriff bei der MySql-Datenbank an?

Einführung: Manchmal müssen wir zur Entwicklung e...

Implementierung einer geplanten Sicherung in Mysql5.7

1. Suchen Sie mysqldump.exe im MySQL-Installation...

3 verschiedene Möglichkeiten zum Löschen der Optionsoptionen im Auswahltag

Methode 1 Code kopieren Der Code lautet wie folgt:...

Detaillierte Erklärung der neuen CSS-Eigenschaft display:box

1. Anzeige:Box; Wenn Sie diese Eigenschaft für ei...

vue + tp5 realisiert eine einfache Anmeldefunktion

In diesem Artikelbeispiel wird der spezifische Co...

Implementierung des Vue 3.x-Projekts basierend auf Vite2.x

Erstellen eines Vue 3.x-Projekts npm init @vitejs...

JavaScript imitiert den Taobao-Lupeneffekt

In diesem Artikel wird der spezifische Code für J...

js behandelt die Kontoabmeldung beim Schließen des Browsers

Inhaltsverzeichnis Klassischer Ansatz Frage Weite...

Implementierung der Nginx-Arbeitsprozessschleife

Nach dem Start initialisiert der Worker-Prozess z...

Vorschau auf die neuen Funktionen von XHTML 2.0

<br />Bevor Browser die nächste Generation v...