Eine kurze Diskussion über die Lösung für übermäßige Daten in ElementUI el-select

Eine kurze Diskussion über die Lösung für übermäßige Daten in ElementUI el-select

1. Szenariobeschreibung

Ich weiß nicht, ob Sie diese Erfahrung schon einmal gemacht haben. Das Dropdown-Feld enthält viele Optionen, Zehntausende oder sogar mehr. Wenn Sie zu diesem Zeitpunkt alle Daten in das Dropdown-Feld eingeben und rendern, friert der Browser ein und die Erfahrung ist besonders schlecht.

Einige Benutzer sagen möglicherweise, dass die Auswahl von Element-UI eine Remote-Methode hat, die die Remote-Suche unterstützt. Können wir nicht einfach den Server bitten, dies zu unterstützen? Dies ist natürlich eine Lösung. Aber manchmal ist diese Methode möglicherweise nicht anwendbar

(1) Manchmal werden die serverseitigen Daten nach der Berechnung an uns zurückgegeben, und die Rückgabe erfolgt möglicherweise nicht sehr schnell, sodass die Erfahrung nicht sehr gut ist. (2) Manchmal gibt es möglicherweise nur ein paar tausend Daten, und es ist nicht sinnvoll, sie alle darzustellen. Es ist nicht sehr gut, die Schnittstelle klein zu halten. (3) Kann das Problem nur durch das Front-End gelöst werden? Wenn es gelöst werden kann, würde das nicht die Arbeit und den Druck auf dem Server reduzieren?

2. Lösung

1) Segmentiertes Laden: Die Dropdown-Elemente werden nicht geladen. Wenn Sie auf das Dropdown-Feld klicken, werden sie geladen. Zu diesem Zeitpunkt werden alle Optionen geladen. Diese Situation gilt nur für langsames Laden. Sie müssen zum Laden klicken, bevor Sie die Optionen aufklappen können. Die Erfahrung ist durchschnittlich.
2) Tipp: Die Auswahl von element-ui verfügt über eine Filtermethode, mit der wir die Dropdown-Elemente filtern können. Angenommen, wir haben ein Dropdown-Feld, um den Benutzer auszuwählen

<el-Auswahl
  v-model="Benutzer-ID"
  filterbar
  :filter-method="BenutzerFilter"
  löschbar>
  <el-Option
    v-for="Element in Benutzerliste"
    :Schlüssel="item.userId"
    :label="item.benutzername"
    :Wert="Artikel.Benutzer-ID"
  ></el-Option>
</el-Auswahl>
BenutzerFilter(Abfrage = '') {
  lass arr = this.allUserList.filter((item) => {
    returniere item.username.includes(Abfrage) || item.userId.includes(Abfrage)
  })
  wenn (arr.length > 50) {
    diese.Benutzerliste = arr.slice(0, 50)
  } anders {
    diese.Benutzerliste = arr
  }
},
getUserWhiteList() {
  HttpRequest.post("/api/admin/community/getUserWhiteList").dann(
    Antwort => {
      diese.allUserList = Antwort.Daten.Liste;
      dies.userFilter()
    }
  );
},

Wie oben gezeigt, erhalten wir die Benutzerliste aus dem Hintergrund. Nach unserer eigenen Filterung rendern wir jeweils nur 50 Daten. Unabhängig davon, wie viele Daten vorhanden sind, unterstützt es eine Variable für uns und belegt Speicher. Natürlich ist die Array-Durchquerung umso langsamer, je mehr Daten vorhanden sind, aber dies hat kaum Auswirkungen.
Wir können nicht nur Namen filtern, sondern auch alle von uns festgelegten Elemente optimieren: Wir können den obigen Code auch entsprechend optimieren. Wir werden die Durchquerung erst beenden, wenn wir feststellen, dass die Länge des Arrays 50 Elemente überschreitet.

Lösung für El-Select-Komponente mit zu vielen Optionen

Geschäftsszenario

Wenn bei Verwendung der El-Select-Komponente zu viele Optionen vorhanden sind, treten Nachteile auf:

Die Seite rendert eine große Anzahl von El-Option-Knoten, die dazu führen, dass die Seite einfriert oder sogar ganz aufhört, was zu einer sehr schlechten Benutzererfahrung führt.
Die Auswahl ist zu groß, was die Suche erschwert.

Das Szenario, das ich dieses Mal erlebte, war eine Situation, in der die Anzahl der Optionen 6.000 bis 9.000 betrug.

Lösung

Nehmen Sie die kleine Option (renderOption) des festen Elements aus den Gesamtoptionen für die Seitendarstellung heraus, indem Sie die
Die Methode „Filtermethode“ führt eine Suchfilterung durch und aktualisiert während der Suche die Renderoption mit den Filterergebnissen.

Code-Implementierung Unten finden Sie die Komponentenkapselung von Vue

<Vorlage>
    <el-Auswahl
        Klasse="yt-select"
        v-model="aktuellerWert"
        filterbar
        v-bind="$attrs"
        :filter-method="BenutzerFilter"
        :deaktiviert="deaktiviert"
        :löschbar="löschbar"
        @change="ändern"
    >
        <el-Option
            v-for="Option in Renderoption"
            :Schlüssel="Option.Wert"
            :Wert="Option.Wert"
            :label="Option.label"
        >{{ option.label }}</el-option>
    </el-Auswahl>
</Vorlage>

<Skript>

Standard exportieren {
    Name: "easy-select",
    Requisiten: {
        Wert: {
            Typ: [Zeichenfolge, Zahl],
            Standard: ''
        },
        max: {
            Typ: Nummer,
            Standard: 30
        },
        deaktiviert:
            Typ: Boolean,
            Standard: false
        },
        löschbar: {
            Typ: Boolean,
            Standard: true
        },
        Optionen:
            Typ: Array,
            Standard: () => []
        }
    },
    Daten () {
        zurückkehren {
            Renderoption: []
        }
    },
    berechnet: {
        aktuellerWert: {
            erhalten () {
                gib diesen Wert zurück || ''
            },
            setze (Wert) {
                dies.$emit('Eingabe', Wert)
            }
        }
    },
    betrachten:
        Wert () {
            dies.addValueOptions()
        },
        Optionen:
            Handler (V) {
                dies.init()
            },
            tief: wahr
        }
    },
    erstellt () {
        dies.init()
    },
    Methoden: {
        asynchrone Initialisierung () {
            dies.userFilter()
            dies.addValueOptions()
        },
        addValueOptions () {
            wenn (dieser.aktuellerWert) {
                let target = this.options.find((item) => { // Finde das aktuelle Element aus der großen Option return item.value === this.currValue
                })
                if (target) { // Vergleiche das aktuelle Element mit der kleinen Option, wenn nicht, füge hinzu if (this.renderOption.every(item => item.value !== target.value)) {
                        this.renderOption.unshift(Ziel)
                    }
                }
            }
        },
        addFilterOptions (Bezeichnung) {
         // Stellen Sie bei jeder Suche nach einer Eingabe sicher, dass sich das Element in der Renderoption befindet, sofern es eine genaue Übereinstimmung gibt. let target = this.options.find((item) => { // Suchen Sie das aktuelle Element aus der großen Option. return item.label === label
            })
            if (target) { // Vergleiche das aktuelle Element mit der kleinen Option, wenn nicht, füge hinzu if (this.renderOption.every(item => item.label !== target.label)) {
                    this.renderOption.unshift(Ziel)
                }
            }
        },
        BenutzerFilter (Abfrage = '') {
            lass arr = diese.Optionen.Filter((Element) => {
                returniere item.label.includes(Abfrage) || item.value.includes(Abfrage)
            })
            wenn (arr.Länge > this.max) {
                diese.renderOption = arr.slice(0, diese.max)
                this.addFilterOptions(Abfrage)
            } anders {
                diese.renderOption = arr
            }
        },
        ändern (Wert) {
            dies.$emit('ändern', Wert)
            if (!value) { // Einzelauswahl der Löschoptionen initialisiert this.userFilter()
            }
        }
    }
}
</Skript>

Vorsichtsmaßnahmen

  • Beim Initialisieren und Ändern des Werts müssen Sie das dem Wert entsprechende spezifische Element finden und es zu renderOptions hinzufügen.
  • Bei der Suche ist es möglich, dass keines der herausgefilterten n Datenelemente das vom Benutzer gesuchte spezifische Element enthält. Daher ist beim Filtern eine genaue Suche erforderlich, und die übereinstimmenden Elemente werden in den renderOptions-Header eingefügt.

Dies ist das Ende dieses Artikels über die Lösung des Problems zu vieler Daten in ElementUI el-select. Weitere Informationen zum Problem zu vieler Daten in ElementUI el-select finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Lösen Sie das Auslöseproblem des Änderungsereignisses, wenn Vue ElementUI El-Select verwendet.
  • Beheben Sie das Problem, dass der Standardwert nicht gelöscht werden kann, wenn Sie das Dropdown-Mehrfachauswahlfeld el-select in element-ui verwenden
  • Detaillierte Erklärung zum Abrufen zusätzlicher Parameter für das Dropdown-Feld el-select von Vue + Element-ui
  • Element-ui Remote-Suchkomponente el-select Komponenten-Implementierungscode im Projekt
  • Detaillierte Erläuterung des Standardauswahlproblems von el-select in element-ui
  • Der el-select-Selektor in der Element-UI von vue2.0 kann den ausgewählten Inhalt nicht anzeigen (Lösung)

<<:  So installieren Sie ROS Noetic in Ubuntu 20.04

>>:  Lösen Sie das Problem, dass der MySQL-Server aktiv die Verbindung trennt, wenn kein Betriebstimeout vorliegt

Artikel empfehlen

Das WeChat-Applet implementiert eine einfache Taschenrechnerfunktion

WeChat-Applet: Einfacher Rechner. Zu Ihrer Inform...

Nexus nutzt API für den Betrieb

Nexus bietet RestApi, aber einige APIs müssen noc...

JavaScript-Canvas zum Erzielen eines farbenfrohen Uhreffekts

Verwenden Sie Leinwand, um eine bunte Uhr zu schr...

Tutorial zur Installation der PyTorch-Entwicklungsumgebung unter Windows

Anaconda-Installation Anaconda ist ein Softwarepa...

HTML+CSS zum Erstellen einer Schaltfläche im Cyberpunk-Stil

Erster Blick auf die Wirkung: Vorwort: Auf diese ...

Vue-Komponenten Dynamische Komponenten detaillierte Erklärung

Inhaltsverzeichnis Zusammenfassen Zusammenfassen ...

Einführung in die schnelle Docker-Bereitstellung eines SpringBoot-Projekts

1. Docker installieren Öffnen Sie zunächst die Li...

Der Button ist im IE auf beiden Seiten gestreckt

Wenn Sie Schaltflächen (Eingabe, Schaltfläche) sch...

So lösen Sie das Problem der Randüberlappung

1. Zunächst müssen Sie wissen, was den vertikalen ...

Einführung in die Installation und Konfiguration von JDK unter CentOS-Systemen

Inhaltsverzeichnis Vorwort Überprüfen und deinsta...