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

CSS realisiert Div vollständig zentriert, ohne Höhe festzulegen

Erfordern Das Div unter dem Körper ist vertikal z...

Detaillierte Analyse der Unterschiede zwischen break und last in Nginx

Lassen Sie uns zunächst über den Unterschied spre...

Reines HTML und CSS, um den JD-Karusselleffekt zu erzielen

Das JD-Karussell wurde mit reinem HTML und CSS im...

Beispielcode zum Ändern der Farbe eines PNG-Bildes durch einen CSS3-Filter

Diese Methode verwendet den filter in CSS3 drop-s...

Detaillierte Erklärung der Slots in Vue

Die Wiederverwendung von Code in Vue liefert uns ...

Erste Schritte mit Mysql - SQL-Ausführungsprozess

Inhaltsverzeichnis 1. Prozess 2. Kernarchitektur ...

Häufig verwendete höherwertige Funktionen und umfassende Beispiele in Vue

1. Häufig verwendete höherwertige Funktionen von ...

Detaillierte Erklärung zur Konfiguration der OpenGauss-Datenbank im Docker

Für Windows-Benutzer Verwenden von openGauss in D...

JavaScript implementiert die umfassendste Codeanalyse einer einfachen Lupe (ES5)

In diesem Artikel wird der spezifische Code von J...

So erstellen Sie schnell eine LAMP-Umgebung auf der CentOS-Plattform

Dieser Artikel beschreibt anhand eines Beispiels,...

Ein Beispiel für die Implementierung eines adaptiven Quadrats mit CSS

Die traditionelle Methode besteht darin, ein Quad...

Beispielerklärung für Ausführungskontext und Ausführungsstapel in JavaScript

JavaScript - Prinzipienreihe Wenn wir in der tägl...