<template> <div :class="{ 'hidden': hidden }" class="pagination-container"> <el-pagination :background="background" v-model:current-page="currentPage" v-model:page-size="pageSize" :layout="layout" :page-sizes="pageSizes" :pager-count="pagerCount" :total="total" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </div> </template> <script setup> import { scrollTo } from '@/utils/scroll-to' const props = defineProps({ total: { required: true, type: Number }, page: { type: Number, default: 1 }, limit: { type: Number, default: 20 }, pageSizes: { type: Array, default() { return [10, 20, 30, 50] } }, // 移动端页码按钮的数量端默认值5 pagerCount: { type: Number, default: document.body.clientWidth < 992 ? 5 : 7 }, layout: { type: String, default: 'total, sizes, prev, pager, next, jumper' }, background: { type: Boolean, default: true }, autoScroll: { type: Boolean, default: true }, hidden: { type: Boolean, default: false } }) const emit = defineEmits(); const currentPage = computed({ get() { return props.page }, set(val) { emit('update:page', val) } }) const pageSize = computed({ get() { return props.limit }, set(val){ emit('update:limit', val) } }) function handleSizeChange(val) { if (currentPage.value * val > props.total) { currentPage.value = 1 } emit('pagination', { page: currentPage.value, limit: val }) if (props.autoScroll) { scrollTo(0, 800) } } function handleCurrentChange(val) { emit('pagination', { page: val, limit: pageSize.value }) if (props.autoScroll) { scrollTo(0, 800) } } </script> <style scoped> .pagination-container { background: #fff; padding: 32px 16px; } .pagination-container.hidden { display: none; } </style>