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

So finden Sie langsame MySQL-Abfragen

Vorwort Ich glaube, dass jeder in seiner tägliche...

Unterschiede zwischen MySQL CHAR und VARCHAR beim Speichern und Lesen

Einführung Kennen Sie wirklich den Unterschied zw...

mysql Backup-Skript und halten Sie es für 7 Tage

Skriptanforderungen: Sichern Sie die MySQL-Datenb...

So installieren und konfigurieren Sie den Supervisor-Daemon unter CentOS7

Neuling, nimm es selbst auf 1. Supervisor install...

mysql5.6.zip-Format komprimierte Version Installations-Grafik-Tutorial

Vorwort: MySQL ist ein relationales Datenbankverw...

Webdesign-TabIndex-Element

TabIndex dient zum Drücken der Tabulatortaste, um ...

Anwendungsbeispiele für React Hooks (6 gängige Hooks)

1. useState: Funktionskomponenten Status geben An...

Tutorial zur Verwendung des Hyperlink-Tags in HTML

Die verschiedenen HTML-Dokumente der Website sind...

HTML-Tabellen-Markup-Tutorial (38): Rahmenfarben-Attribut der Kopfzeile BORDERCOLOR

Um die Tabelle zu verschönern, können Sie für die...

Interpretieren von MySQL-Client- und Serverprotokollen

Inhaltsverzeichnis MySQL-Client/Server-Protokoll ...

Installieren Sie Ubuntu 18 ohne USB-Laufwerk unter Windows 10 mit EasyUEFI

1. BIOS überprüfen Überprüfen Sie zunächst, in we...

Grundlegendes Tutorial zur Verwendung der Explain-Anweisung in MySQL

Inhaltsverzeichnis 1. Übersicht 1. Aussagetest er...

Eine vorläufige Studie zum Vue-Unit-Testing

Inhaltsverzeichnis Vorwort Warum Unit-Tests einfü...

Pycharm2017 realisiert die Verbindung zwischen Python3.6 und MySQL

In diesem Artikel erfahren Sie, wie Sie Python3.6...