Vue implementiert einen Wasserfallfluss mit unendlichem Laden

Vue implementiert einen Wasserfallfluss mit unendlichem Laden

In diesem Artikelbeispiel wird der spezifische Code von Vue zur Erzielung eines Wasserfallflusses mit unendlichem Laden als Referenz bereitgestellt. Der spezifische Inhalt ist wie folgt

Der von mir erstellte Wasserfallfluss wird auf einer verschachtelten Seite platziert, die dem Hauptinhalt des Verwaltungshintergrunds ähnelt. Wenn Sie ihn auf Vollbild ändern möchten, ist dies auch sehr praktisch. Tatsächlich ist es einfacher, da einige Fallstricke bei der Verwendung von onScroll auf Elementen vermieden werden.

Durch diesen Wasserfallfluss können Sie die folgenden Wissenspunkte meistern:

1. Das Abhören von Bildlaufereignissen auf Elementen ist etwas mühsamer, als das direkte Abhören am Fenster.
2. image.onload-Ereignis;
3. versprecheAlles;
4. Vues Übergangsgruppe

Hier wird mockjs verwendet, um die Bilddaten zu simulieren, und dann werden die Bilddaten über axios aufgerufen. Es können auch andere Datenquellen verwendet werden.

Bestimmen Sie durch Berechnen der Bildhöhe, in welche Spalte das Bild geladen werden soll.
Wenn auf dem Bildschirm noch Platz ist, fahren Sie mit dem Laden fort.
Endloses Scrollen beim Laden.
Die Bildschirmgrößenanpassung wurde noch nicht durchgeführt, kann aber später hinzugefügt werden.

Fügen Sie den Code direkt ein. Wenn Sie Fragen haben, können Sie diese gerne diskutieren.

<Vorlage>
  <div class="Wasserfall wf-wrap" ref="Wasserfall" @scroll="onScroll">
    <ul>
      <transition-group name="list" tag="li">
        <li
          v-for="(Element, Index) in Wasserfallliste"
          :Schlüssel="Index"
          Klasse="wf-item"
          :Stil="{oben:Element.oben+'px',links:Element.links+'px', Breite:Element.breite+'px', Höhe:Element.höhe + 'px'}"
        >
          <img :src="item.src" />
        </li>
      </Übergangsgruppe>
    </ul>
  </div>
</Vorlage>
<Skript>
importiere { getList } von "@/api/demo";

Standard exportieren {
  Name: "Wasserfall",
  Daten() {
    zurückkehren {
      WasserfallListe: [],

      WasserfallCol: 5,
      Spaltenbreite: 236,
      Rand rechts: 10,
      Rand unten: 10,
      Spaltenhöhen: [],

      Listenabfrage: {
        Seite: 1,
        Grenze: 5,
        Sortieren: "+id"
      },
      wird geladen: falsch,
      zeigen: wahr
    };
  },
  montiert() {
    dies.init();
  },
  Methoden: {
    init() {
      // Bei der Initialisierung beträgt die Höhe jeder Spalte 0
      this.colHeights = neues Array(this.waterfallCol);
      für (lass i = 0; i < this.colHeights.length; i++) {
        this.colHeights[i] = 0;
      }
      this.colWidth =
        (this.$refs.waterfall.clientWidth -
          (diese.WasserfallCol - 1) * diese.MarginRight) /
        dieser.WasserfallCol;
      dies.loadImgs();
    },

    ladeImgs() {
      dies.laden = wahr;
      // Daten von der API abrufen getList(this.listQuery).then(res => {
        lass Bilder = res.data.items;
        lass promiseAll = [],
          Bilder = [],
          Gesamt = Bilder.Länge;

        für (sei i = 0; i < gesamt; i++) {
          promiseAll[i] = neues Versprechen(resolve => {
            imgs[i] = neues Bild();
            imgs[i].src = Bilder[i].Bild_uri;
            imgs[i].onload = () => {
              lass imgData = {};
              imgData.height = (imgs[i].height * this.colWidth) / imgs[i].width;
              imgData.width = diese.colWidth;
              imgData.src = Bilder[i].image_uri;
              dies.waterfallList.push(imgData);
              dies.rankImgs(imgData);
              auflösen (Bilder[i]);
            };
          });
        }
        Versprechen.alles(versprechenAlles).dann(() => {
          dies.laden = falsch;
          dies.loadMore();
        });
      });
    },

    ladeMehr() {
      Wenn (
        dies.$refs.waterfall.clientHeight + dies.$refs.waterfall.scrollTop >
          dies.filterMin().minHeight &&
        dies.wird geladen == false
      ) {
        dies.laden = wahr;
        setzeTimeout(() => {
          dies.loadImgs();
        }, 200);
      }
    },

    rankImgs(imgData) {
      lass min = this.filterMin();
      imgData.top = min.minHeight;
      imgData.left = min.minIndex * (this.colWidth + this.marginRight);

      this.colHeights[min.minIndex] += imgData.height + this.marginBottom;
    },

    filterMin() {
      let minHeight = Math.min.apply(null, this.colHeights);
      zurückkehren {
        minHöhe: minHöhe,
        minIndex: this.colHeights.indexOf(minHeight)
      };
    },

    beimScrollen() {
      dies.loadMore();
    }
  }
};
</Skript>

<style lang="scss" scoped>
ul li {
  Listenstil: keiner;
}

.wf-wrap {
  Position: relativ;
  Breite: 100 %;
  Höhe: 100%;
  Überlauf: scrollen;
}
.wf-Artikel {
  Position: absolut;
}
.wf-item img {
  Breite: 100 %;
  Höhe: 100%;
}
.list-enter-active,
.Liste-leave-active {
  Übergang: alles 1en;
}
.list-enter, .list-leave-to
/* .list-leave-active für Versionen unter 2.1.8 */ {
  Deckkraft: 0;
  transformieren: übersetzenY(30px);
}
</Stil>

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Vue implementiert das Gleiten der Wasserfallflusskomponente, um mehr zu laden
  • Die Vue-Wasserfall-Flow-Komponente realisiert Pull-Up-Laden mehr
  • Vue implementiert ein einfaches Wasserfall-Flusslayout
  • Vue implementiert einen Netzwerkbild-Wasserfallfluss + nach unten ziehen zum Aktualisieren + nach oben ziehen zum Laden weiterer Elemente (detaillierte Schritte)
  • Schreiben Sie ein Wasserfall-Plugin-Codebeispiel über Vue
  • Beispiel für die Verwendung des Vue-Waterfall-Plugin
  • Die vue.js-Komponente vue-waterfall-easy realisiert den Wasserfall-Flusseffekt

<<:  Nicht standardmäßiger Implementierungscode für die MySQL UPDATE-Anweisung

>>:  Markup-Validierung für Doctype

Artikel empfehlen

So erstellen Sie mit Squid einen Proxyserver für http und https

Als wir nginx eingeführt haben, haben wir nginx a...

Eine kurze Diskussion über die Semantik von HTML und einige einfache Optimierungen

1. Was ist Semantisierung? Erklärung zum Bing-Wör...

Kopieren und Einfügen ist der Feind der Verpackung

Bevor wir über OO, Entwurfsmuster und die vielen o...

So begrenzen Sie die Anzahl gleichzeitiger Verbindungsanforderungen in Nginx

Einführung Das Modul, das die Anzahl gleichzeitig...

Koexistenz von Python2 und Python3 unter einem CentOS7-System

Der erste Schritt besteht darin, die Versionsnumm...

22 Vue-Optimierungstipps (Projektpraxis)

Inhaltsverzeichnis Code-Optimierung Verwenden der...

Analyse der Probleme und Lösungen beim Importieren großer Datenmengen in MySQL

Im Projekt stoßen wir häufig auf das Problem, gro...

Detaillierte Erläuterung der benutzerdefinierten Vue-Anweisungen

Inhaltsverzeichnis Benutzerdefinierte Vue-Direkti...

Zusammenfassung der MySQL-Datenmigration

Inhaltsverzeichnis Vorwort: 1. Über die Datenmigr...

Einfache Tipps zur Erhöhung der Ladegeschwindigkeit von Webseiten

Die Ladegeschwindigkeit einer Webseite ist ein wic...

HTML+Sass implementiert HambergurMenu (Hamburger-Menü)

Vor ein paar Tagen habe ich mir ein Video von ein...