Vue implementiert eine Scroll-Ladetabelle

Vue implementiert eine Scroll-Ladetabelle

Ergebnisse erzielen

Code Cloud-Adresse

Wissensreserve für rollende Ladungen

Beziehen Sie sich auf die Idee des Ladens durch Listen-Scrollen in Ant-Design-Vue und verwenden Sie Vue-Infinite-Scroll plus Vue-Virtual-Scroller als Lösung.

Komponentenverpackung

Da das vom gesamten System verwendete Framework Ant-Design-Vue ist, ist der Variablenbenennungsstil der Komponentenkapselung so konsistent wie möglich mit A-Table.

1. Benennung der Komponenten

XScrollTable.vue

2. Zur Verfügung gestellte Requisiten

Pflichtfelder:

dataSource – Datenquelle

Spalten – Die in der Tabelle angezeigten Spalteninformationen. Die Slot-Nutzung ist nicht genau dieselbe wie bei einer Tabelle, die weiter unten erwähnt wird.

itemSize – die Höhe jeder Datenzeile

Optionale Felder:

rowKey – Kennung des Primärschlüssels der Daten, Standard ist „key“

Höhe - Die Höhe des Tabellenanzeigebereichs, der Standardwert ist 500

pageSize - Die Datenmenge, die bei jedem Scrollen der Tabelle geladen wird. Der Standardwert ist 30.

infiniteScrollDistance – Die Distanzbedingung zum Auslösen des Ladens der Tabelle, der Standardwert ist 10

rowSelection – Konfiguration für Mehrfachauswahl in Tabellen, die verarbeiteten Attribute sind selectedRowKeys, onChange, width. Der Standardwert ist Null und Mehrfachauswahlen werden nicht angezeigt.

3. Anwendungsbeispiele

Initialisieren Sie zunächst 10.000 Datensätze und stellen Sie diese in einer Tabelle dar.

Lassen Sie Daten = neues Array (10000).fill(1);

Daten = Daten.Map((Element1, Index) => {
    lass Element = {};
    Artikel-ID = Index;
    Artikel.Alter = "Name";
    item.address = "Adresse";
    Artikel zurückgeben;
});
Standarddaten exportieren;

Hinweis: fill(1) wird hier hinzugefügt, weil die vom Array-Konstruktor generierten Daten alle leer sind, kein Array-Index vorhanden ist und die Map-Schleife nicht ausgeführt werden kann.

Laden der Tabelle

<x-scroll-tabelle
                Stil="Rand oben: 10px"
                Zeilenschlüssel="id"
                :Artikelgröße="22"
                :rowSelection="{selectedRowKeys: selectedRowKeys, beiÄnderung: beiSelectChange,width:50}"
                :columns="Spalten"
                :dataSource="Daten">
            <template slot="Aktion" slot-scope="{Datensatz,Text}">
                <a @click="handleDetail(Datensatz)">Details</a>
            </Vorlage>
        </x-scroll-table>

Zusammenfassung der Komponentenverpackung

1. Verwenden Sie nach Möglichkeit berechnete Eigenschaften

Obwohl die Tabelle einfach gekapselt ist, müssen noch viele Attribute definiert werden. Die Verwendung berechneter Attribute anstelle der Definition von Variablen in Daten kann den Arbeitsaufwand bei der Variablenwartung verringern.

Die gesamte Komponente definiert nur eine Seitenvariable und die anderen verwenden berechnete Eigenschaften.

  Daten() {
    zurückkehren {
      // Aktuelle Anzeigeseitennummer Seite: 1,
    };
  },

Zum Beispiel:

Definieren Sie eine berechnete Eigenschaft über das Seitenattribut, um die aktuell geladene Datenmenge anzugeben

 // Die maximale Anzahl der anzuzeigenden Indizes kann größer sein als die Gesamtzahl der Datenelemente. Verwenden Sie Slice, um dieses Problem zu lösen. lastIndex() {
      gib diese Seitengröße zurück * diese Seite;
    },

Durch diese berechnete Eigenschaft werden gleichzeitig andere berechnete Eigenschaften abgeleitet

// Zeigt an, ob die Tabellendaten geladen wurden busy() {
      gibt diesen.letztenIndex >= diese.Datenquelle.Länge zurück;
    },
 // Die aktuell in die RecycleScroller-Scrolling-Komponente geladenen Daten tableData() {
      gibt diese.dataSource.slice(0, diesen.letztenIndex) zurück;
    },

Aus einer Seiteneigenschaft werden eine Reihe berechneter Eigenschaften abgeleitet. Ich muss nur die Seiteneigenschaft pflegen, die anderen werden automatisch berechnet.

2. Schlitze für den Tisch bereitstellen

Zunächst werden über den von der Tabelle übergebenen Parameter columns die Spalten berechnet, die gerendert werden sollen. Dabei werden auch die berechneten Eigenschaften verwendet.

 // Konvertiere das Spalten-Array in ein Spaltenobjekt, wobei du den columnFieldKey-Wert als Schlüssel und das Array-Element als Wert verwendest columnMap() {
      gib dies zurück.Spalten.Reduce((returnValue, cur) => {
        returnValue[cur[Spaltenfeldschlüssel]] = cur;
        Rückgabewert zurückgeben;
      }, {});
    },
    // Den Spaltenschlüsselwert im Array abrufen – columnFieldKey
    Spaltenschlüssel() {
      gib diese Spalten zurück
          .map(item => item[spaltenFeldschlüssel]);
    },

Durchlaufen der Vorlage

<div v-for="(Schlüssel) von Spaltenschlüsseln"
             Klasse = "Ellipsenzelle"
             :Schlüssel="Schlüssel"
             :Stil="ArtikelStil(SpaltenMap[Schlüssel])"
        >
          <slot v-if="izSlotRender(SpaltenMap[Schlüssel])"
                :name="columnMap[Schlüssel].scopedSlots.customRender"
                :Datensatz="Zeile"
                :text="Zeile[Schlüssel]">
          </slot>
          <span v-else :title="Zeile[Schlüssel]">{{ renderItem(Zeile, Index, Schlüssel) }}</span>
        </div>

  // Ob Slot-Rendering verwendet werden soll izSlotRender(item) {
      gibt item.scopedSlots und item.scopedSlots.customRender zurück;
    },

Wenn beim Definieren von Spalten scopedSlots und customRender übergeben werden, wird das Slot-Rendering verwendet.

Allerdings gibt es hier einen Unterschied zur Tabellensteckplatzdarstellung in Ant-Design-Vue.

Ich habe den Slot über das Slot-Tag definiert. Wenn die übergeordnete Komponente die Slot-Parameter erhält, kann ich nur die Objektdekonstruktionsmethode slot-scope="{record,text}" verwenden. Die Ant-Design-Vue-Tabelle kann Slot-Scope="Record,Text" direkt verwenden, um Parameter abzurufen.

Eine weitere Implementierung des Scrollens beim Laden von Daten

Wenn viele Tabellendaten vorhanden sind, dauert das Laden der Seite eine Weile, bevor die Daten angezeigt werden. Das ist keine gute Erfahrung, daher müssen Sie scrollen, um die Daten zu laden.

<el-table :data="materialliste" style="width: 100%" class="familyDataDetail" height="250">
                <el-table-column prop="eventId" label="Ereignis-ID">
                    <Vorlage Umfang="Umfang">
                        <label>{{eventMap[scope.row.eventId] == null ? '--': eventMap[scope.row.eventId].sn}}</label>
                    </Vorlage>
                </el-Tabellenspalte>
                <el-table-column prop="title" label="Entsprechendes Ereignis">
                    <Vorlage Umfang="Umfang">
                        <label>{{eventMap[scope.row.eventId] == null ? '--': eventMap[scope.row.eventId].title}}</label>
                    </Vorlage>
                </el-Tabellenspalte>
                <el-table-column prop="Alter" label="Verantwortliche Person">
                    <Vorlage Umfang="Umfang">
                        <label>{{eventMap == null || eventMap[scope.row.eventId] == null || eventMap[scope.row.eventId].personalInformation == null ? '--':
                            eventMap[scope.row.eventId].personalInformation.name}}</label>
                    </Vorlage>
                </el-Tabellenspalte>
                <el-table-column prop="Geburtstag" label="Materialname">
                    <Vorlage Umfang="Umfang">
                        <label>{{materirlName}}</label>
                    </Vorlage>
                </el-Tabellenspalte>
                <el-table-column prop="idcardNo" label="status">
                    <Vorlage Umfang="Umfang">
                        <label>{{formatType(scope.row.type)}}</label>
                    </Vorlage>
                </el-Tabellenspalte>
                <el-table-column prop="Beziehung" label="Menge">
                    <Vorlage Umfang="Umfang">
                        <label>{{formatUseNum(scope.row.useNum)}}</label>
                    </Vorlage>
                </el-Tabellenspalte>
                <el-table-column prop="ethnisch" label="Nutzungszeit">
                    <Vorlage Umfang="Umfang">
                        <label>{{Änderungszeit(scope.row.createOn)}}</label>
                    </Vorlage>
                </el-Tabellenspalte>
            </el-Tabelle>

Unten ist der js-Teil

Methoden: {
  init (Parameter) {
  let id = param.param && param.param.id
  wenn(id){
      dies.start = 0
          MaterialRecordService.query({param: {baseId: this.baseId, materialId: id},start: this.start,limit: 30}).then(rsp => {//Erste Daten anfordern, 30 Datensätze this.start += 30
            diese.materialliste = rsp.daten
            MissionEventService.microList({ids: rsp.data.map(n => n.eventId)}).then(rsp3 => {
                diese.eventMap = {}
                rsp3.data.forEach(n => (diese.eventMap[n.id] = n))

                             })
             })
  }
  },
  beimScrollen() {
      let inner = document.querySelector('.el-table__body-wrapper');
      if(inner.scrollHeight - inner.scrollTop <= inner.clientHeight){//Wenn true, beweist dies, dass das Ende erreicht ist und die Schnittstelle angefordert werden kann. if(this.flag){//Einen Schalter für das Scroll-Ereignis festlegen (Flag deklarieren: true in Daten). Der Standardwert ist true.
             this.flag = falsch
                          MaterialRecordService.query({param: {baseId: this.baseId, materialId: this.entity.id},start: this.start,limit:30}).then(rsp => {//30 Elemente gleichzeitig laden this.materielList = this.materielList.concat(rsp.data)
                  dies.start += 30
                  dieses.flag = wahr
              MissionEventService.microList({ids: rsp.data.map(n => n.eventId)}).then(rsp3 => {
               rsp3.data.forEach(n => (diese.eventMap[n.id] = n))
              })
             })
                    }
      }
   }
},
montiert () {
      this.init({...this.param})<br> //Auf das Scroll-Ereignis des Tabellen-DOM-Objekts hören document.querySelector('.el-table__body-wrapper').addEventListener('scroll', this.onScroll);
    }

Hier möchte ich erklären, welches DOM-Objekt überwacht wird

Ich muss auch die drei Eigenschaften scrollHeight, scrollTop und clientHeight erklären

Dies ist ein Screenshot eines fremden Bildes mit einigen Ergänzungen

scrollHeight: Die Höhe des vollständigen Textes der Webseite.

scrollTop: Die Höhe des Webseiten-Scrolls,

clientHeight: Die Höhe des sichtbaren Bereichs der Webseite

Oben finden Sie den detaillierten Inhalt der Vue-Implementierung von Scroll-Ladetabellen. Weitere Informationen zu Vues Scroll-Ladetabellen finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Vue implementiert reines Front-End-Tabellen-Scrollen und Seitenladen
  • Benutzerdefinierte Vue-Anweisungen generieren UUID-Scroll-Überwachungscode, um den Tab-Tabellendeckeneffekt zu erzielen
  • Implementierungsmethode für das verzögerte Laden von Vue ElementUI-Tabellentabellendaten-Scrollen
  • Vue-Element-UI-Tabellentabellen-Scroll-Lademethode
  • Vue verwendet Animation, um einen Scroll-Tabelleneffekt zu erzielen

<<:  Ausführliches Tutorial zur Installation von MySQL 5.6-ZIP-Paketen

>>:  Nginx-Überwachungsprobleme unter Linux

Artikel empfehlen

Erfahrung in der Lösung von Tomcat-Speicherüberlaufproblemen

Vor einiger Zeit habe ich Testern eine Produktver...

Vue Storage enthält eine Lösung für Boolesche Werte

Vue speichert Speicher mit Booleschen Werten Ich ...

CSS3 realisiert den verschiebbaren Zauberwürfel-3D-Effekt

Hauptsächlich verwendete Wissenspunkte: •CSS3 3D-...

Lösen Sie das Problem der verstümmelten Zeichen im Tomcat10 Catalina-Protokoll

Laufumgebung, Idea2020-Version, Tomcat10, beim Au...

Tabellen in HTML aufteilen und zusammenführen (colspan, rowspan)

Der Code demonstriert die horizontale Zusammenfüh...

Tutorial zur Installation, Bereitstellung und Verwaltung von KVM-Virtualisierung

Inhaltsverzeichnis 1.kvm-Bereitstellung 1.1 KVM-I...

Details zum Überschreiben von Prototypmethoden in JavaScript-Instanzobjekten

Inhaltsverzeichnis In JavaScript können wir norma...