vue 手写分页

75 阅读1分钟

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;
            // 第一种特殊情况: 连贯页 > 总页码
            // 总数91,每页显示30,,连贯页5,当前页3
            if (continues > totalPage) {
                start = 1;
                end = totalPage;
            } else {
                // 第二种情况:起始页 < 1
                // 总数91,每页显示3,连贯页5,当前页2
                start = pageNo - parseInt(continues / 2);
                end = pageNo + parseInt(continues / 2);
                if (start < 1) {
                start = 1;
                end = continues;
            }
            // 第三种情况:结束页 > 总页码
            // 总数91,每页显示3,连贯页7, 当前页30
                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>