167 lines
3.6 KiB
Vue
167 lines
3.6 KiB
Vue
<template>
|
|
<nav>
|
|
<ul class="pagination">
|
|
<li :class="{ disabled: currentPage == 1 }">
|
|
<div @click="setCurrent(1)">首页</div>
|
|
</li>
|
|
<li v-if="currentPage !== 1" :class="{ disabled: currentPage == 1 }">
|
|
<div @click="setCurrent(currentPage - 1)">«</div>
|
|
</li>
|
|
<li
|
|
v-for="(p, index) in grouplist"
|
|
:key="index"
|
|
:class="{ active: currentPage == p.val }"
|
|
>
|
|
<div @click="setCurrent(p.val)">{{ p.text }}</div>
|
|
</li>
|
|
<li
|
|
v-if="currentPage !== page"
|
|
:class="{ disabled: currentPage == page }"
|
|
>
|
|
<div @click="setCurrent(current + 1)">»</div>
|
|
</li>
|
|
<li :class="{ disabled: currentPage == page }">
|
|
<div @click="setCurrent(page)">末页</div>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</template>
|
|
|
|
<script type="es6">
|
|
export default{
|
|
props: {
|
|
total: {// 数据总条数
|
|
type: Number,
|
|
default: 0
|
|
},
|
|
display: {// 每页显示条数
|
|
type: Number,
|
|
default: 8
|
|
},
|
|
currentPage: {// 当前页码
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
pagegroup: {// 分页条数
|
|
type: Number,
|
|
default: 5,
|
|
coerce (v) {
|
|
v = v > 0 ? v : 5;
|
|
return v % 2 === 1 ? v : v + 1;
|
|
}
|
|
}
|
|
},
|
|
data(){
|
|
return {
|
|
current: this.currentPage
|
|
}
|
|
},
|
|
computed: {
|
|
page () { // 总页数
|
|
return Math.ceil(this.total);
|
|
},
|
|
grouplist () { // 获取分页页码
|
|
let len = this.page;
|
|
let temp = []
|
|
const list = [];
|
|
const count = Math.floor(this.pagegroup / 2);
|
|
let center = this.current;
|
|
if (len <= this.pagegroup) {
|
|
while (len--) {
|
|
temp.push({text: this.page - len, val: this.page - len});
|
|
}
|
|
;
|
|
return temp;
|
|
}
|
|
while (len--) {
|
|
temp.push(this.page - len);
|
|
}
|
|
;
|
|
const idx = temp.indexOf(center);
|
|
(idx < count) && ( center = center + count - idx);
|
|
(this.current > this.page - count) && ( center = this.page - count);
|
|
temp = temp.splice(center - count - 1, this.pagegroup);
|
|
do {
|
|
const t = temp.shift();
|
|
list.push({
|
|
text: t,
|
|
val: t
|
|
});
|
|
} while (temp.length);
|
|
if (this.page > this.pagegroup) {
|
|
(this.current > count + 1) && list.unshift({text: '...', val: list[0].val - 1});
|
|
(this.current < this.page - count) && list.push({text: '...', val: list[list.length - 1].val + 1});
|
|
}
|
|
return list;
|
|
}
|
|
},
|
|
watch:{
|
|
currentPage:{
|
|
handler(val,oldval){
|
|
},
|
|
deep:true
|
|
},
|
|
},
|
|
methods: {
|
|
setCurrent (idx) {
|
|
if (this.current !== idx && idx > 0 && idx < this.page + 1) {
|
|
this.current = idx;
|
|
this.$emit('pagechange', this.current);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
.pagination {
|
|
overflow: hidden;
|
|
display: flex;
|
|
margin: 0 auto;
|
|
/*width: 100%;*/
|
|
height: 50px;
|
|
color: #ffecd9;
|
|
justify-content: center;
|
|
align-items: center;
|
|
li,
|
|
.disabled {
|
|
// float: left;
|
|
text-align: center;
|
|
height: 30px;
|
|
border-radius: 5px;
|
|
margin: 3px;
|
|
color: #666;
|
|
list-style: none;
|
|
|
|
& :hover {
|
|
background: #fff9e9;
|
|
color: #8b67aa;
|
|
|
|
div {
|
|
color: #8b67aa;
|
|
}
|
|
}
|
|
div {
|
|
width: 70px;
|
|
height: 30px;
|
|
// text-align: center;
|
|
font-size: 12px;
|
|
border-radius: 5px;
|
|
color: #fff9e9;
|
|
text-decoration: none;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
}
|
|
}
|
|
.active {
|
|
background: #fff9e9;
|
|
|
|
div {
|
|
font-weight: bold;
|
|
color: #8b67aa;
|
|
}
|
|
}
|
|
}
|
|
</style>
|