Tabellen-Paging-Funktion implementiert durch Vue2.0+ElementUI+PageHelper

Tabellen-Paging-Funktion implementiert durch Vue2.0+ElementUI+PageHelper

Vorwort

Ich habe kürzlich an einigen Front-End-Projekten gearbeitet und muss einige Tabellen auf Seiten anzeigen. Es gibt viele Möglichkeiten, eine Tabelle zu paginieren. Aus einer Makroperspektive kann man sie in physisches und logisches Paging unterteilen. Da beim logischen Paging (d. h. Front-End-Paging) alle Daten zwischengespeichert und dann auf Seiten angezeigt werden, wirkt sich dies bei großen Datenmengen auf die Browsergeschwindigkeit aus. Nach reiflicher Überlegung habe ich daher Back-End-Paging verwendet. Das Merkmal des Back-End-Paging besteht darin, dass es die Daten der aktuellen Seite anfordert und jedes Mal, wenn sich die Seitenzahl oder die Datenmenge pro Seite ändert, eine Anforderung erneut sendet. Die wichtigsten hier zum Einsatz kommenden Technologien sind:

  • Frühling
  • SpringMVC
  • Mybatis
  • VueJS 2.0
  • ElementUI

Die Backend-Datenbank verwendet MySQL, es können jedoch auch andere Datenbanken verwendet werden, da das PageHelper-Plugin mit verschiedenen Datenbanken kompatibel ist. Das Wesentliche von PageHelper besteht darin, einen Interceptor einzufügen, um vor der Ausführung der MyBatis SQL-Anweisung eine Paging-Operation durchzuführen, wodurch im Wesentlichen zwei Grenzparameter hinzugefügt werden. Informationen zur Konfiguration und Verwendung von PageHelper finden Sie im Artikel „Spring + Mybatis verwendet das PageHelper-Plug-In für die Paginierung“, der hier nicht wiederholt wird.

Das Front-End verwendet das kürzlich populäre VueJS-Framework 2.0, ein Framework mit MVVM-Architektur, das AngularJS ähnelt, aber leichter ist. Das verwendete UI-Framework ist das vom Ele.me-Team eingeführte ElementUI-Framework. Dies ist ein auf VueJS basierendes Framework, das sich perfekt mit unserem Front-End-Framework kombinieren lässt und viele Komponenten kapselt, was die Entwicklung sehr komfortabel macht.
Nachfolgend sehen Sie einen Screenshot dieser Demo, die die grundlegenden Funktionen zum Hinzufügen, Löschen, Ändern und Abfragen implementiert. Die Tabellensortierung ist ein integriertes Attribut des Tabellensteuerelements von elementUI und kann einfach eingestellt werden.

Text

Unten sehen Sie einen Screenshot des Programms. Sie können es deutlicher sehen, indem Sie mit der rechten Maustaste klicken und das Bild in einem neuen Tab öffnen.

Screenshot

Werfen wir einen Blick auf den Frontend-Code. Zunächst die importierten Dateien:

    <link rel="stylesheet" href="/core/element-ui/lib/theme-default/index.css" rel="externes nofollow" >
    <script src="./js/jquery-3.1.1.min.js"></script>
    <script src="./js/json2.js"></script>
    <script src="./js/vue.min.js"></script>  
    <script src="./js/vue-resource.js"></script>
    <script src="./element-ui/lib/index.js"></script>

Die erste und letzte Zeile sind die Importpakete von ElementUI. Sie können die Quelldateien von der offiziellen Website von ElementUI herunterladen oder sie direkt über CDN importieren:

<!-- Stil importieren -->
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-default/index.css" rel="externes nofollow" >
<!-- Komponentenbibliothek importieren-->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>

Die vorletzte Zeile „vue-resource“ ist ein Ajax-Plugin für vuejs, das Anfragen initiieren und Antworten über XMLHttpRequest oder JSONP verarbeiten kann. Einfach ausgedrückt kann es zum Senden von Ajax-Anfragen verwendet werden.

Als nächstes kommt der Stil

    <Stil>
      .el-Auswahl .el-Eingabe {
        Breite: 110px;
      }
 
      .el-Tabelle .info-Zeile {
            Hintergrund: #c9e5f5;
      }   
 
      #Spitze {
          Hintergrund: #20A0FF;
          Polsterung: 5px;
          Überlauf: versteckt
      }
    </Stil>

HTML-Text

    <div id="test">             
 
        <div id="oben">          
            <span style="float:right;"> 
                <el-button type="text" @click="add" style="color:white">Hinzufügen</el-button>  
                <el-button type="text" @click="deletenames" style="color:white">Stapellöschung</el-button>        
            </span>                     
        </div>  
 
 
        <br/>
 
        <div Stil="Rand oben:15px">
           <el-input placeholder="Bitte Inhalt eingeben" v-model="Kriterien" style="padding-bottom:10px;">
              <el-select v-model="Auswählen" slot="prepend" placeholder="Bitte auswählen">
                 <el-option label="id" value="1"></el-option>
                 <el-option label="name" value="2"></el-option>
              </el-Auswahl>
              <el-button slot="anhängen" icon="suchen" v-on:click="suchen"></el-button>
          </el-Eingabe>       
 
          <el-Tabelle
            ref="Testtabelle"       
            :data="Tabellendaten"
            Stil="Breite:100%"
            Grenze
            :default-sort = "{prop: 'id', order: 'aufsteigend'}"
            @selection-change="Auswahländerungsgriff"   
            @row-click="Handleklick"
            :Zeilenklassenname = "Tabellenzeilenklassenname"
            >
            <el-table-column
              Typ="Auswahl"
              >
            </el-Tabellenspalte>
            <el-table-column
              prop="Ich würde"
              Bezeichnung="Ich würde"
              sortierbar
              Überlauf-Tooltip anzeigen>
            </el-Tabellenspalte>
            <el-table-column
              Eigenschaft = "Name"
              Bezeichnung="Name"
              sortierbar>
            </el-Tabellenspalte>
            <el-table-column label="Vorgang">
              <Vorlage Umfang="Umfang">
                <el-Schaltfläche
                  Größe="klein"
                  Typ="primär"
                  @click="handleEdit(scope.$index, scope.row)">Bearbeiten</el-button>
                <el-Schaltfläche
                  Größe="klein"
                  Typ="Gefahr"
                  @click="handleDelete(scope.$index, scope.row)">Löschen</el-button>
              </Vorlage>
            </el-Tabellenspalte>
          </el-Tabelle>
 
          <div ausrichten="zentrieren">
              <el-pagination
                  @size-change="Größenänderungsgriff"
                  @current-change="AktuelleÄnderung handhaben"
                  :current-page="aktuelleSeite"
                  :Seitengrößen="[10, 20, 30, 40]"
                  :page-size="Seitengröße"
                  Layout = "Gesamt, Größen, Zurück, Pager, Weiter, Jumper"
                  :total="Gesamtzahl">
              </el-pagination>
          </div>
        </div> 
    </div>
 
    <Fußzeile ausrichten="center">
        <p>&copy; Vue.js 2.0 + ElementUI-Paging-Demo</p>
    </Fußzeile>

Der nächste Schritt besteht darin, eine Vue-Instanz zu erstellen. Hier kommt ES5 zum Einsatz.

    <Skript>
    var vue = neuer Vue({         
            el:"#test",
            Daten: {       
                //Tabelle aktuelle Seitendaten tableData: [],
 
                //Mehrfachauswahl-Array multipleSelection: [],
 
                //Angeforderte URL
                URL: „newstu/querystudentbypage“,
 
                //Suchkriterien: '',
 
                //Dropdown-Menüoptionen auswählen: '',
 
                //Standardseitengröße: 10,
 
                //Standardmäßig hervorgehobene Zeilendaten-ID
                Highlight-ID: -1,
 
                //Aktuelle Seitennummer currentPage: 1,
 
                //Abfrageseitennummer beginnt: 1,
 
                //Standard-Gesamtdaten totalCount: 1000,
            },
 
            Methoden: {
 
                //Daten vom Server lesen loadData: function(criteria, pageNum, pageSize){                    
                    dies.$http.get(diese.url,{parameter:kriterien, seitennummer:seitennummer, seitengröße:seitengröße}).dann(funktion(res){
                        diese.tableData = res.data.pagestudentdata;
                        Dies ist die Gesamtanzahl der Datensätze, die in der Tabelle angezeigt werden.
                    },Funktion(){
                        console.log('fehlgeschlagen');
                    });                 
                },
 
                //Antwort mit Mehrfachauswahl handleSelectionChange: function(val) {
                    diese.multipleSelection = Wert;
                },
 
                //Klicken Sie auf die Zeilenantwort handleclick: function(row, event, column){
                    diese.highlightId = zeilen-id;
                },
 
                //Handle bearbeitenEdit: function(index, row) {
                    this.$prompt('Bitte geben Sie einen neuen Namen ein', 'prompt', {
                          confirmButtonText: 'Bestätigen',
                          cancelButtonText: 'Abbrechen',
                        }).then(({ Wert }) => {
                            wenn(Wert==''||Wert==null)
                                zurückkehren;
                            dies.$http.post('newstu/update',{"id":row.id,"name":value},{emulateJSON: true}).dann(function(res){
                                dies.loadData(dieses.Kriterium, diese.aktuelleSeite, diese.Seitengröße);                              
                            },Funktion(){
                                console.log('fehlgeschlagen');
                            });
                        }).catch(() => {
 
                    });
                },
 
 
                // einzelne Zeile löschen handleDelete: function(index, row) {
                    var-Array = [];
                    Array.push(Zeile.ID);
                    dies.$http.post('newstu/delete',{"array":array},{emulateJSON: true}).dann(function(res){
                        dies.loadData(dieses.Kriterium, diese.aktuelleSeite, diese.Seitengröße);
                    },Funktion(){
                        console.log('fehlgeschlagen');
                    });
                },
 
                //Suchesearch: function(){
                    dies.loadData(dieses.Kriterium, diese.aktuelleSeite, diese.Seitengröße);
                },
 
                //hinzufügenhinzufügen: Funktion(){
                        this.$prompt('Bitte geben Sie einen Namen ein', 'prompt', {
                          confirmButtonText: 'Bestätigen',
                          cancelButtonText: 'Abbrechen',
                        }).then(({ Wert }) => {
                            wenn(Wert==''||Wert==null)
                                zurückkehren;
                            dies.$http.post('newstu/add',{"name":Wert},{emulateJSON: true}).dann(Funktion(res){
                                dies.loadData(dieses.Kriterium, diese.aktuelleSeite, diese.Seitengröße);
                            },Funktion(){
                                console.log('fehlgeschlagen');
                            });
                        }).catch(() => {
 
                    });
 
                },
 
                //Mehrere Löschungen deletenames: function(){
                    wenn(this.multipleSelection.length==0)
                        zurückkehren;
                    var-Array = [];
                    dies.multipleSelection.forEach((item) => {
                        : Array.push(Artikel.ID);
                    })
                    dies.$http.post('newstu/delete',{"array":array},{emulateJSON: true}).dann(function(res){
                        dies.loadData(dieses.Kriterium, diese.aktuelleSeite, diese.Seitengröße);
                    },Funktion(){
                        console.log('fehlgeschlagen');
                    });
                },
 
                //Ändere die Klasse der aktuell angeklickten Zeile und markiere die aktuelle Zeile tableRowClassName: function(row, index){
                   wenn(row.id == diese.highlightId)
                   {
                      gib „Infozeile“ zurück;
                   }
                },
 
                //Ändern der pro Seite angezeigten Datenmenge handleSizeChange: function(val) {
                    diese.Seitengröße = Wert;
                    dies.loadData(dieses.Kriterium, diese.aktuelleSeite, diese.Seitengröße);
                },
 
                //Seitenzahl ändern handleCurrentChange: function(val) {
                    diese.aktuelleSeite = Wert;
                    dies.loadData(dieses.Kriterium, diese.aktuelleSeite, diese.Seitengröße);
                },        
 
            },      
 
 
          });
 
          //Daten laden vue.loadData(vue.criteria, vue.currentPage, vue.pagesize);
    </Skript>

Lassen Sie uns nun den obigen Code einfach erklären. tableData ist ein Array von Daten, die auf der aktuellen Seite der Tabelle angezeigt werden. Wenn die Webseite geladen wird, wird zuerst die Methode loadData ausgeführt. criteria ist die aktuelle Suchbedingung, die standardmäßig leer ist. Der zweite Parameter ist die aktuelle Seitenzahl, die standardmäßig die erste Seite ist. Der dritte Parameter ist der Offset, also die Zahl, die Sie abfragen möchten, also die Datenmenge, die auf jeder Seite enthalten ist. Immer wenn sich die Seitenzahl oder die Datenmenge pro Seite ändert, wird diese Methode mit den neuen Werten dieser Parameter als Parameter erneut aufgerufen. Werfen wir einen Blick auf den Controller-Code:

    @AntwortBody
    @RequestMapping(Wert = "/querystudentbypage", Methode = RequestMethod.GET)  
    öffentliche Map<String, Object> querystudentbypage(@RequestParam(value="parameter")String-Parameter, 
            @RequestParam(value="Seitennummer")int Seitennummer, @RequestParam(value="Seitengröße")int Seitengröße) 
    {  
        Seite<Student> Seite = iNewStudentService.selectStudents(Parameter, Seitennummer, Seitengröße);
        Map<String, Objekt> map = neue HashMap<String, Objekt>();
        map.put("pagestudentdata", Seite);
        map.put("Zahl", page.getTotal());
        Rückfahrkarte;
    }

ce-Implementierungscode:

    öffentliche Seite<Student> selectStudents(String-Parameter, int Seitennummer, int Seitengröße)
    {
        Seite<Student> Seite = PageHelper.startPage(Seitennummer, Seitengröße);
        newstudentMapper.selectStudents(Parameter);
        Rückseite;
    }

Mybatis-Code

    <select id="selectStudents" resultMap="NewStudentResultMap">
        Wählen Sie ID, Name des Studenten aus, wobei ID=#{parameter} oder Name wie CONCAT('%',#{parameter},'%')  
    </Auswählen>

Hinweis: Der Einfachheit halber wird hier im Code die Benutzereingabe unscharf verarbeitet. Das ID-Feld in der Datentabelle entspricht der Benutzereingabe bzw. das Namensfeld enthält die Benutzereingabe und kann abgefragt werden.

Aus der Serviceimplementierungsklasse und dem Mabatis-Code oben können wir ersehen, dass wir der SQL-Anweisung kein Limit manuell hinzugefügt haben, sondern vor newstudentMapper.selectStudents(Parameter); die Seite page = PageHelper.startPage(pageNum, pageSize) hinzugefügt haben. Dieser Code ist ein Aufruf von PageHelper. Sie müssen sich keine Gedanken darüber machen, wie PageHelper implementiert wird (tatsächlich über Interceptor). Nur dieser Code wird benötigt, um physische Seitenumbrüche vorzunehmen. Es bearbeitet eine darauf folgende SQL-Abfrage und gibt nach der Seitenumbruchänderung den aktuellen Seitencode zurück.
Wir können sehen, dass in der Karte im Controller zwei Werte eingetragen sind, einer ist die zurückgegebene Liste und der andere die Gesamtdatenmenge. Das Tabellensteuerelement auf dem Front-End verwendet diese Liste und das Paging-Steuerelement verwendet die gesamte Datenmenge. Beachten Sie die startPage-Parameter. Der erste ist die Seitennummer, die Sie anfordern möchten, und der zweite ist die Datenmenge auf der angeforderten Seite. Diese beiden sollten den von der Front-End-Anfrage gesendeten Parametern entsprechen.

Zu den weiteren Grundfunktionen des Programms gehören Hinzufügen, Ändern, Löschen, Stapellöschen usw. Die Front-End-Codes wurden erläutert, und das Back-End ruft lediglich die Datenbank auf, sodass der Back-End-Code hier nicht eingefügt wird.

Notiz:
Die Hervorhebungsfunktion für Tabellenzeilen per Klick kann im ElementUI-Tabellensteuerelement durch Hinzufügen des Attributs „Highlight-current-row“ festgelegt werden. Die Hervorhebungsfarbe ist jedoch in der CSS-Datei gekapselt. Ich habe dieses Attribut hier nicht verwendet, sondern einen Klassenstil angepasst und den angepassten Stil der aktuellen Zeile zugewiesen, wenn auf eine Zeile geklickt wird. Wenn Sie mit der Hervorhebungsfarbe von ElementUI selbst nicht zufrieden sind und die CSS-Datei nicht ändern möchten, können Sie eine Zeilenklickreaktion wie in diesem Artikel gezeigt anpassen.

Schlussworte

Als Frontend-Steuerung ist vuejs in den letzten Jahren immer beliebter geworden. Die Community ist sehr aktiv und es gibt eine große Anzahl von Open-Source-Projektbibliotheken, die dazu passen. Eine detaillierte Liste finden Sie in der Zusammenfassung der Vue Open Source-Projektbibliothek. Wenn vuejs in Open-Source-Bibliotheken integriert wird, wird die Effizienz der Front-End-Entwicklung erheblich verbessert, insbesondere für Back-End-Ingenieure wie mich, die mit dem Front-End nicht sehr vertraut sind. Sie können die Front-End-Entwicklung auch durchführen, indem sie sich auf die Tutorials und Beispiele auf der offiziellen Website beziehen. Wenn Sie ES6 verwenden, ist die Modularisierung einfacher.

ElementUI ist auch eine sehr gute Komponentenbibliothek, die über eine gute Kapselung und Schnittstellen für häufig verwendete Komponenten wie Tabellen, Formulare, Zeit- und Datumsauswahl usw. verfügt.

PageHelper ist ein von einem Chinesen geschriebenes Mybatis-Paging-Plugin. Es bietet eine sehr gute Leistung, unterstützt alle gängigen Datenbanken und ist sehr einfach zu verwenden.

Was Sie für die Front-End-Entwicklung lernen müssen, ist nicht viel weniger als für die Back-End-Entwicklung und erfordert mehr Erfahrung. Hier werde ich den Lernprozess der Front-End-Entwicklung aufzeichnen.

Dies ist das Ende dieses Artikels über die von Vue2.0+ElementUI+PageHelper implementierte Tabellenseitenfunktion. Weitere relevante Inhalte zur Tabellenseitenfunktion von Vue2.0 ElementUI PageHelper finden Sie in den vorherigen Artikeln von 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:
  • Die Vue-Komponentenbibliothek ElementUI realisiert den Paging-Effekt einer Tabellenliste
  • So verwenden Sie die ElementUI-Paginierungskomponente Paginierung in Vue
  • Detaillierte Erklärung des Problems, dass die Paging-Komponentenansicht von elementUI nicht aktualisiert wird, wenn Vue sie ändert
  • Die Komponententabelle von vue + elementUI realisiert die Front-End-Paging-Funktion
  • Vue + ElementUI-Tabelle realisiert Tabellenpaging
  • Vue + ElementUI implementiert Paging-Funktion - MySQL-Daten

<<:  Beheben Sie das Problem, dass Änderungen an der Docker MySQL-Containerdatenbank nicht wirksam werden

>>:  Die neueste Version von MySQL 8.0.22 herunterladen und installieren - super ausführliches Tutorial (Windows 64 Bit)

Artikel empfehlen

CentOS 7.6 Installation der MySQL 5.7 GA-Version Tutorial-Diagramm

Inhaltsverzeichnis Umgebungsvorbereitung Umgebung...

So verwenden Sie Binlog zur Datenwiederherstellung in MySQL

Vorwort Kürzlich wurden Daten online falsch bearb...

So starten und starten Sie nginx unter Linux neu

Nginx (Engine x) ist ein leistungsstarker HTTP- u...

Vue.js-Framework implementiert Warenkorbfunktion

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

Unterschiede zwischen proxy_pass in zwei Modulen in nginx

1. Die proxy_pass -Direktive des Moduls 1.ngx_str...

Detaillierte Erklärung der Desktop-Anwendung mit Vue3 und Electron

Inhaltsverzeichnis Vue CLI erstellt ein Vue-Proje...

Befehlscodebeispiele für die Installation und Konfiguration von Docker

Docker-Installation Installieren von Abhängigkeit...

Detaillierte Erläuterung der Nginx-Timeout-Konfiguration

Ich habe kürzlich in einem Projekt nginx und im B...

CSS3-Flip-Card-Nummern-Beispielcode

Ich habe heute eine Aufgabe von der Firma erhalte...

Webdesign-Erfahrung: Effizientes Schreiben von Webcode

Ursprünglich sollte dieses siebte Kapitel eine aus...

Quellcode der HTML-Einstellungen für die Benutzerregistrierungsseite

Gestalten Sie die oben gezeigte Webseite: <!DOC...

Grundlegende Operationen der MySQL-Lernnotizentabelle

Tabelle erstellen Tabelle erstellen Tabellenname ...