Javascript VueJs 如何使用限制器和范围进行分页..?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/35596389/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
VueJs how to make pagination with limiter and range..?
提问by b4dQuetions
I have code like this :
我有这样的代码:
var demoList = new Vue({
el: '#demoList',
data: {
items: [{
"id": 1,
"name": "Tom"
}, {
"id": 2,
"name": "Kate"
}, {
"id": 3,
"name": "Hyman"
}, {
"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": "Hyman"
}, {
"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 stuck trying to create a pager with vuejs, so I was wonder if anyone can appoint an example of how to make a pager like this if is possible "1-2-3-4-5 ... 55" ??, thanks again for any help.
我一直试图用 vuejs 创建一个寻呼机,所以我想知道是否有人可以指定一个例子来说明如何制作这样的寻呼机,如果可能的话“1-2-3-4-5 ... 55”??,谢谢再次寻求帮助。
回答by Jeff
Check out this code:
看看这个代码:
https://jsfiddle.net/os7hp1cy/48/
https://jsfiddle.net/os7hp1cy/48/
html:
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:
css:
a.first::after {
content:'...'
}
a.last::before {
content:'...'
}
Basically, it only shows pagination that is within 2 pages of the current page. Then it will also show page 1 and the last page, and will put "..."
before or after the number with CSS. So if you are on page 10, it will show:
基本上,它只显示当前页面 2 页内的分页。然后它还会显示第 1 页和最后一页,并"..."
用 CSS 将数字放在数字之前或之后。因此,如果您在第 10 页,它将显示:
1... 8 9 10 11 12 ...21
1... 8 9 10 11 12 ...21
回答by deathemperor
I've forked @Jeff's code and make a working version for Vue 2 due to this filter migration https://vuejs.org/v2/guide/migration.html#Filters-Outside-Text-Interpolations-removed.
由于此过滤器迁移https://vuejs.org/v2/guide/migration.html#Filters-Outside-Text-Interpolations-removed ,我已经分叉了 @Jeff 的代码并为 Vue 2 制作了一个工作版本。
paginate method is moved to computed:
paginate 方法移动到计算:
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)
}
WARNING: I didn't apply the text filter, just the pagination first.
警告:我没有应用文本过滤器,只是先应用分页。