2016-02-24 4 views
17

Ich habe Code wie folgt aus:
VueJs wie man Paginierung mit Begrenzer und Bereich ..?

var demoList = new Vue({ 
 
    el: '#demoList', 
 
    data: { 
 
    items: [{ 
 
     "id": 1, 
 
     "name": "Tom" 
 
    }, { 
 
     "id": 2, 
 
     "name": "Kate" 
 
    }, { 
 
     "id": 3, 
 
     "name": "Jack" 
 
    }, { 
 
     "id": 4, 
 
     "name": "Jill" 
 
    }, { 
 
     "id": 5, 
 
     "name": "aa" 
 
    }, { 
 
     "id": 6, 
 
     "name": "bb" 
 
    }, { 
 
     "id": 7, 
 
     "name": "cc" 
 
    }, { 
 
     "id": 8, 
 
     "name": "dd" 
 
    }, { 
 
     "id": 1, 
 
     "name": "Tom" 
 
    }, { 
 
     "id": 2, 
 
     "name": "Kate" 
 
    }, { 
 
     "id": 3, 
 
     "name": "Jack" 
 
    }, { 
 
     "id": 4, 
 
     "name": "Jill" 
 
    }, { 
 
     "id": 5, 
 
     "name": "aa" 
 
    }, { 
 
     "id": 6, 
 
     "name": "bb" 
 
    }, { 
 
     "id": 7, 
 
     "name": "cc" 
 
    }, { 
 
     "id": 8, 
 
     "name": "dd" 
 
    }, ], 
 
    loading: false, 
 
    order: 1, 
 
    searchText: null, 
 
    ccn: null, 
 
    currentPage: 0, 
 
    itemsPerPage: 2, 
 
    resultCount: 0 
 
    }, 
 
    computed: { 
 
    totalPages: function() { 
 
     console.log(Math.ceil(this.resultCount/this.itemsPerPage) + "totalPages"); 
 
     return Math.ceil(this.resultCount/this.itemsPerPage); 
 

 
    } 
 
    }, 
 
    methods: { 
 
    setPage: function(pageNumber) { 
 
     this.currentPage = pageNumber; 
 
     console.log(pageNumber); 
 
    } 
 
    }, 
 
    filters: { 
 
    paginate: function(list) { 
 
     this.resultCount = this.items.length; 
 
     console.log(this.resultCount + " Result count"); 
 
     console.log(this.currentPage + " current page"); 
 
     console.log(this.itemsPerPage + " items per page"); 
 
     console.log(this.totalPages + " Total pages 2"); 
 
     if (this.currentPage >= this.totalPages) { 
 
     this.currentPage = Math.max(0, this.totalPages - 1); 
 
     } 
 
     var index = this.currentPage * this.itemsPerPage; 
 
     console.log(index + " index"); 
 
     console.log(this.items.slice(index, index + this.itemsPerPage)); 
 
     return this.items.slice(index, index + this.itemsPerPage); 
 
    } 
 
    } 
 
});
a { 
 
    color: #999; 
 
} 
 
.current { 
 
    color: red; 
 
} 
 
ul { 
 
    padding: 0; 
 
    list-style-type: none; 
 
} 
 
li { 
 
    display: inline; 
 
    margin: 5px 5px; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.js"></script> 
 
<div id="demoList"> 
 
    <div class="containerTable"> 
 
    <table class="table"> 
 
     <thead> 
 
     <tr class="header"> 
 
      <th> 
 
      <div><a @click="sortvia('provider_name')">Provider</a> 
 
      </div> 
 
      </th> 
 
     </tr> 
 
     </thead> 
 
     <tbody> 
 
     <tr v-for="item in items | paginate"> 
 
      <td>{{item.name}}</td> 
 
     </tr> 
 
     </tbody> 
 
    </table> 
 
    </div> 
 
    <ul> 
 
    <li v-for="pageNumber in totalPages"> 
 
     <a href="#" @click="setPage(pageNumber)">{{ pageNumber+1 }}</a> 
 
    </li> 
 
    </ul> 
 
</div>

Im stecken versuchen, einen Pager mit vuejs zu schaffen, also war ich frage mich, ob jemand ein Beispiel ernennen kann, wie einen Pager wie diese machen wenn möglich ist "1-2-3-4-5 ... 55" ??, danke nochmal für jede Hilfe.

+0

Können Sie erklären weiter, was Ihre gewünschte Ausgabe ist? –

+0

Ich möchte in Paginierung Nummer wie folgt "1-2-3-4-5 ... letzte" nicht alle 1-2-3-4-5-6 -7-8 – b4dQuetions

+0

Sie könnten ein ngif = "$ Index - Seite <5 " –

Antwort

23

Schauen Sie sich diesen Code:

https://jsfiddle.net/os7hp1cy/48/

html:

<ul> 
    <li v-for="pageNumber in totalPages" 
     v-if="Math.abs(pageNumber - currentPage) < 3 || pageNumber == totalPages - 1 || pageNumber == 0"> 
    <a href="#" @click="setPage(pageNumber)" 
     :class="{current: currentPage === pageNumber, last: (pageNumber == totalPages - 1 && Math.abs(pageNumber - currentPage) > 3), first:(pageNumber == 0 && Math.abs(pageNumber - currentPage) > 3)}"> 
     {{ pageNumber+1 }}</a> 
    </li> 
</ul> 

css:

a.first::after { 
    content:'...' 
} 

a.last::before { 
    content:'...' 
} 

Im Grunde ist es zeigt nur die Paginierung, die innerhalb von 2 Seiten des Stroms Seite. Dann wird es auch Seite 1 und die letzte Seite zeigen und "..." vor oder nach der Nummer mit CSS setzen. Also, wenn Sie auf Seite 10 sind, wird es zeigen:

1... 8 9 10 11 12 ...21

+0

Ich habe diesen Code in meinem Beispiel versucht und aus irgendeinem Grund gibt es eine Warnung: [Vue warnen]: Eigenschaft oder Methode" paginate "ist nicht für die Instanz definiert, sondern während des Rendern verwiesen. Stellen Sie sicher, dass reaktive Dateneigenschaften in der Datenoption deklariert sind. (in Root-Instanz gefunden) Ich habe die Funktion paginate in Filtern, die innerhalb Methoden sind. – linous

1

Ich habe @ Jeffs Code gegabelt und eine Arbeitsversion https://vuejs.org/v2/guide/migration.html#Filters-Outside-Text-Interpolations-removed für Vue 2 aufgrund dieses Filters Migration machen.

Paginieren Methode wird berechnet bewegt:

paginate: function() { 
     if (!this.users || this.users.length != this.users.length) { 
      return 
     } 
     this.resultCount = this.users.length 
     if (this.currentPage >= this.totalPages) { 
      this.currentPage = this.totalPages 
     } 
     var index = this.currentPage * this.itemsPerPage - this.itemsPerPage 
     return this.users.slice(index, index + this.itemsPerPage) 
    } 

WARNUNG: Ich kann nicht den Text-Filter angewendet haben, sondern nur die Paginierung zuerst.

https://jsfiddle.net/c1ghkw2p/