vue 手写分页
<template>
<div class="pagination" v-show="total">
<button :disabled="pageNo === 1" @click="sendPageNo(pageNo - 1)">上一页</button>
<button v-show="startAndEnd.start > 1" @click="sendPageNo(1)">1</button>
<button v-show="startAndEnd.start > 2">...</button>
<button
v-for="(item, index) in startAndEnd.end - startAndEnd.start + 1"
:key="item"
:class="{ active: pageNo === index + startAndEnd.start }"
@click="sendPageNo(startAndEnd.start + index)"
>
{{ startAndEnd.start + index }}
</button>
<button v-show="startAndEnd.end < totalPage - 1">···</button>
<button v-show="startAndEnd.end < totalPage" @click="sendPageNo(totalPage)">{{ totalPage }}</button>
<button :disabled="pageNo === totalPage" @click="sendPageNo(pageNo + 1)">下一页</button>
<button style="margin-left: 30px">共 {{ total }} 条</button>
</div>
</template>
<script>
export default {
name: 'Pagination',
data() {
return {
total: 2906,
pageNo: 1,
pageSize: 50,
continues: 5
};
},
computed: {
totalPage() {
return Math.ceil(this.total / this.pageSize);
},
startAndEnd() {
let { pageNo, continues, totalPage } = this;
let start = 0;
let end = 0;
if (continues > totalPage) {
start = 1;
end = totalPage;
} else {
start = pageNo - parseInt(continues / 2);
end = pageNo + parseInt(continues / 2);
if (start < 1) {
start = 1;
end = continues;
}
if (end > totalPage) {
start = totalPage - continues + 1;
end = totalPage;
}
}
return { start, end };
}
},
methods: {
sendPageNo(index) {
this.pageNo = index;
}
}
};
</script>
<style lang="less" scoped>
.pagination {
text-align: center;
padding-bottom: 20px;
button {
margin: 0 5px;
background-color: #f4f4f5;
color: #606266;
outline: none;
border-radius: 2px;
padding: 0 4px;
vertical-align: top;
display: inline-block;
font-size: 13px;
min-width: 35.5px;
height: 28px;
line-height: 28px;
cursor: pointer;
box-sizing: border-box;
text-align: center;
border: 0;
&[disabled] {
color: #c0c4cc;
cursor: not-allowed;
}
&.active {
cursor: not-allowed;
background-color: #409eff;
color: #fff;
}
}
}
</style>