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

Zusammenfassung und Praxis des Javascript-Prototyp-Kettendiagramms

Inhaltsverzeichnis Prototypenkette Wir können ein...

So mounten Sie eine Datenfestplatte auf Tencent Cloud Server Centos

Überprüfen Sie zunächst, ob das Festplattengerät ...

Native JS realisiert einheitliche Bewegungen verschiedener Sportarten

In diesem Artikel wird eine einheitliche Bewegung...

Detaillierte Erläuterung der Tomcat-Konfigurations- und Optimierungslösungen

Service.xml Die Konfigurationsdatei Server.xml wi...

Vue macht Div-Höhe verschiebbar

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

4 Möglichkeiten zur Optimierung von MySQL-Abfragen für Millionen von Daten

Inhaltsverzeichnis 1. Der Grund, warum das Limit ...

Tutorial zur Migration von MySQL von phpstudy nach Linux

Projektzweck Migrieren Sie die Daten in MySQL 5.5...

Was bedeutet href=# in einem Link?

Links zur aktuellen Seite. ------------------- Übl...

Detaillierte Erklärung von Javascript-Closures und -Anwendungen

Inhaltsverzeichnis Vorwort 1. Was ist ein Abschlu...

Einführung in den Löschvorgang von B-Tree

Im vorherigen Artikel https://www.jb51.net/articl...

jQuery implementiert den Tabellen-Paging-Effekt

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