JSFiddle - React, Tailwind, and code Playground
by cathead
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/1.0.16/vue.min.js"></script>
<input type="text" v-model="searchKey">
<ul>
<li v-for="user in users | filterBy searchKey | paginate">{{ user.name }}</li>
</ul>
<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 {
color: #999;
}
.current {
color: red;
}
ul {
padding: 0;
list-style-type: none;
}
li {
display: inline;
margin: 5px 5px;
}
a.first::after {
content:'...'
}
a.last::before {
content:'...'
}
JavaScript
new Vue({
el: 'body',
data: {
users: [
{"id":1, "name":"Tom"},
{"id":2, "name":"Kate"},
{"id":3, "name":"Jack"},
{"id":4, "name":"Jill"},
{"id":4, "name":"bill"},
{"id":4, "name":"aill"},
{"id":4, "name":"cill"},
{"id":4, "name":"dill"},
{"id":4, "name":"eill"},
{"id":4, "name":"cill"},
{"id":4, "name":"dill"},
{"id":4, "name":"eill"},
{"id":4, "name":"cill"},
{"id":4, "name":"dill"},
{"id":4, "name":"eill"},
{"id":4, "name":"cill"},
{"id":4, "name":"dill"},
{"id":4, "name":"eill"},
{"id":4, "name":"cill"},
{"id":4, "name":"dill"},
{"id":4, "name":"eill"},
],
searchKey: '',
currentPage: 0,
itemsPerPage: 1,
resultCount: 0
},
computed: {
totalPages: function() {
return Math.ceil(this.resultCount / this.itemsPerPage)
}
},
methods: {
setPage: function(pageNumber) {
this.currentPage = pageNumber
}
},
filters: {
paginate: function(list) {
this.resultCount = list.length
if (this.currentPage >= this.totalPages) {
this.currentPage = this.totalPages - 1
}
var index = this.currentPage * this.itemsPerPage
return list.slice(index, index + this.itemsPerPage)
}
}
})