Implementierung der Leistungsoptimierung des Element-Shuttle-Frames

Implementierung der Leistungsoptimierung des Element-Shuttle-Frames

Hintergrund

Wenn die Shuttle-Box große Datenmengen verarbeitet, kann es passieren, dass die Seite hängen bleibt, weil zu viele DOM-Knoten gerendert werden.
Optimieren Sie, ohne die ursprüngliche Logik der Komponente so weit wie möglich zu verändern.

Lösung

Lazy Loading – Kopieren Sie zuerst die Originalkomponente der InfiniteScroll-Komponente aus Paketen/übertragen Sie sie (oder ändern Sie den Quellcode und verpacken Sie ihn neu, um die Verwendung einer privaten Bibliothek zu verwalten).
Wille

v-infinite-scroll="Bild ab"
:unendliches Scrollen-sofort="falsch"

Hinzufügen zu

<el-checkbox-gruppe
        v-show="!hasNoMatch && Datenlänge > 0"
        v-model="geprüft"
        :size="Größe"
        :Klasse="{ 'ist-filterbar': filterbar }"
        Klasse="el-transfer-panel__list"
        v-infinite-scroll="Bild ab"
        :unendliches Scrollen-sofort="falsch"
      >
        <el-Kontrollkästchen
          Klasse="el-transfer-panel__item"
          :label="Element[Schlüsseleigenschaft]"
          :deaktiviert="Element[deaktivierteProp]"
          :Schlüssel="Element[Schlüsseleigenschaft]"
          v-for="Element in gefilterten Daten">
            <option-content :option="Artikel"></option-content>
        </el-checkbox>
</el-checkbox-group>

Definieren Sie pageSize in data:20, um die Anzahl der Daten pro Seite anzugeben. showData: [] wird nur zur Anzeige verwendet. Ersetzen Sie die tatsächlich zu bearbeitenden Daten im obigen Code durch filteredData.

 v-for="Element in ShowData">

Gleichzeitig erfolgt die entsprechende Verarbeitung in der Uhr

Daten (Daten) {
    const geprüft = [];
    this.showData = data.slice(0, this.pageSize);

    const gefilterteDataKeys = this.filteredData.map(
    (Artikel) => Artikel[diese.keyProp]
    );
    dies.überprüft.fürEach((Element) => {
    wenn (filteredDataKeys.indexOf(item) > -1) {
        geprüft.push(Artikel);
    }
    });
    this.checkChangeByUser = falsch;
    dies.geprüft = geprüft;
},
gefilterteDaten (gefilterteDaten) {
    this.showData = gefilterteDaten.slice(0, this.pageSize);
 }

Die anfängliche Anzeigemenge beträgt 20 nach dem Zufallsprinzip.

Fügen Sie abschließend die Methode hinzu, die beim Scrollen nach unten aufgerufen wird

Seite nach unten () {
    const l = this.showData.length;
    const totalLength = this.filteredData.length
    l < Gesamtlänge && 
    (diese.showData = diese.filteredData.slice(0, l + diese.pageSize > Gesamtlänge ?
    Gesamtlänge: l + diese.Seitengröße));
},

Beim Herunterscrollen erhöht sich die Länge der angezeigten Daten um 20 (die Zahl ist beliebig), bei Überschreitung wird die Maximallänge angezeigt.

Dadurch wird grundsätzlich das Problem der Verlangsamung bei Vorgängen mit großen Datenmengen gelöst. Da die Präsentations- und Logikebenen getrennt sind, muss die Betriebslogik der Komponenten nicht geändert werden, wodurch die Unterschiede minimiert werden.

Neue Fragen

Das manuelle Scrollen bis zum Ende der Liste und die anschließende Suche führen weiterhin zu Verzögerungen.

Fortschrittlich

Beim Scrollen sind die Daten oben noch unsichtbar. Diese Daten werden nicht angezeigt und haben keinen Einfluss auf das Benutzererlebnis.
Es müssen also nur 20 Daten auf der aktuellen Seite angezeigt werden.

Wir fügen der el-checkbox-group einen ref=scrollContainer hinzu, um die Bildlaufleiste zu bedienen.

Definieren Sie die aktuelle Seitenzahl curIndex: 1 in Daten

Und ändern Sie die pageDown-Methode

    Seite nach unten () {
      const totalLength = this.filteredData.length
      wenn((dieser.aktuellerIndex*diese.Seitengröße) < Gesamtlänge){
        dies.curIndex++
        const Ziellänge = this.curIndex * this.Seitengröße 
        const endPoint = Ziellänge > Gesamtlänge ? Gesamtlänge : Ziellänge
        const startPoint = endPoint - diese.Seitengröße > 0 ? endPoint - diese.Seitengröße : 0
        dies.showData = dies.filteredData.slice(Startpunkt, Endpunkt);
        this.$refs.scrollContainer.$el.scrollTop = "1px" //Leiste nach oben scrollen und Verbindung zur nächsten Seite herstellen. 0 kann Begrenzungsprobleme auslösen.}
    }

Dazu müssen wir auch eine Methode zum Umblättern der Seite hinzufügen.

Der Befehl InfiniteScroll ermöglicht nur das Scrollen nach unten. Wir können diesen Befehl erweitern und den Listener mount(){ für das Scrollen nach oben hinzufügen.
        dies.$refs.scrollContainer.$el.addEventListener('scroll', diese.pageUp)
    },
    vorZerstören(){
        dies.$refs.scrollContainer.$el.removeEventListener('scroll', diese.pageUp)
    },

Registrieren der PageUp-Methode

    Seite nach oben (e) {
      wenn(e.target.scrollTop === 0 && this.curIndex> 1){
        this.curIndex --
        const endPoint = this.curIndex * this.pageSize 
        const startPoint = (this.curIndex-1)* diese.Seitengröße 
        dies.showData = dies.filteredData.slice(Startpunkt, Endpunkt);
        const el = this.$refs.scrollContainer.$el
        el.scrollTop = el.scrollHeight – el.clientHeight – 1 // Nach unten scrollen und mit der vorherigen Seite verbinden. -1 verhindert Randprobleme.
      }
    },

Bei der Durchführung von Datenoperationen ändert sich der Seiteninhalt und die Bildlaufleiste ändert sich entsprechend. Um unvorhersehbares Umblättern zu verhindern, werden die Bildlaufleiste und die aktuelle Seitenzahl bei Datenänderungen zurückgesetzt.

    initScroll(){
        this.curIndex = 1
        dies.$refs.scrollContainer.$el.scrollTop = 0
    },

Führen Sie gleichzeitig initScroll zum entsprechenden Zeitpunkt in der Uhr aus

    Daten(){
        ...
        dies.initScroll()
        ...
    },
    gefilterteDaten (gefilterteDaten) {
      ...
      dies.initScroll()
    }

An diesem Punkt wurde die Leistung des Shuttle-Frames für große Datenmengen erheblich verbessert.

Dies ist das Ende dieses Artikels über die Implementierung der Leistungsoptimierung von Element-Shuttleboxen. Weitere relevante Inhalte zur Leistungsoptimierung von Element-Shuttleboxen finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Vue führt den Shuttle-Frame für Element-Transfer auf Anfrage ein
  • Lösung für das Problem, dass es beim Klicken auf „Alles auswählen“ in der Shuttle-Box von Element bei großen Datenmengen hängen bleibt

<<:  Beispielcode für Box-Shadow und Drop-Shadow zum Erreichen einer unregelmäßigen Projektion

>>:  So zeigen Sie MySQL-Links an und löschen abnormale Links

Artikel empfehlen

MariaDB-Serverinstallation der MySQL-Reihe

Inhaltsverzeichnis Tutorial-Reihe 1. Installieren...

Zusammenfassung mehrerer APIs oder Tipps in HTML5, die Sie nicht verpassen sollten

In früheren Blogbeiträgen habe ich mich auf einige...

Detaillierte Erklärung zur Verwendung verschiedener MySQL-Indizes

1. Langsames Abfrageprotokoll 1.1 MySQL-Protokoll...

Drei Möglichkeiten zur Implementierung virtueller Hosts unter Linux7

1. Gleiche IP-Adresse, unterschiedliche Portnumme...

Wie können die Transaktionseigenschaften von MySQL InnoDB sichergestellt werden?

Vorwort Wenn Sie jemand fragt: „Was sind die Merk...

Vuex implementiert einen einfachen Einkaufswagen

In diesem Artikelbeispiel wird der spezifische Co...

Das vergessene Button-Tag

Hinweis: Dieser Artikel wurde von jemand anderem ü...

Detaillierte Erklärung zur Verwendung von Router-View-Komponenten in Vue

Wenn Sie ein Vue-Projekt entwickeln, müssen Sie h...

So verwenden Sie Cursor-Trigger in MySQL

Cursor Die von der Auswahlabfrage zurückgegebenen...

Centos7 installiert mysql5.6.29 Shell-Skript

In diesem Artikel wird das Shell-Skript von mysql...