2016-02-24 26 views
17

mam kod jak poniżej:
VueJs jak zrobić paginację z ogranicznikiem i zakresem ..?

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 zakleszczony próbując stworzyć pager z vuejs, więc byłem dziwnego, jeśli ktoś może powołać przykład jak zrobić pager takiego jeśli jest to możliwe "1-2-3-4-5 ... 55"?, jeszcze raz dziękuję za pomoc.

+0

Czy możesz wyjaśnić, co jest pożądane? –

+0

Chcę w numeracji stronicowania jak ten "1-2-3-4-5 ... last" nie wszystkie 1-2-3-4-5-6 -7-8 – b4dQuetions

+0

można zrobić ngif = "$ index - strona <5 " –

Odpowiedz

23

sprawdzić ten kod:

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:'...' 
} 

Zasadniczo, to tylko pokazuje podział na strony, która jest w ciągu 2 stronach prądu strona. Następnie wyświetli stronę 1 i ostatnią stronę, a przed lub za numerem z CSS wstawi "...". Więc jeśli jesteś na stronie 10, to pokaże:

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

+0

Próbowałem tego kodu w moim przykładzie iz jakiegoś powodu daje mi ostrzeżenie: [Vue warn]: Właściwość lub metoda" paginate "nie jest zdefiniowana w instancji, ale odwołuje się podczas renderowania. Pamiętaj, aby zadeklarować właściwości danych reaktywnych w opcji danych. (znaleziono w instancji root) Mam funkcję paginate w filtrach, które są wewnątrz metod. – linous

1

Mam rozwidlony @ kod Jeffa i zrobić wersję roboczą dla Vue 2 z powodu tej migracji filtra https://vuejs.org/v2/guide/migration.html#Filters-Outside-Text-Interpolations-removed.

metoda paginate zostanie przeniesiona do komputerowej:

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) 
    } 

Ostrzeżenie: nie stosować filtr tekstowy, po prostu paginacji pierwszy.

https://jsfiddle.net/c1ghkw2p/