index.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <template>
  2. <div :class="{ hidden: hidden }" class="pagination-container">
  3. <el-pagination
  4. v-model:current-page="currentPage"
  5. v-model:page-size="pageSize"
  6. :background="background"
  7. :layout="layout"
  8. :page-sizes="pageSizes"
  9. :pager-count="pagerCount"
  10. :total="total"
  11. @size-change="handleSizeChange"
  12. @current-change="handleCurrentChange"
  13. />
  14. </div>
  15. </template>
  16. <script setup name="Pagination" lang="ts">
  17. import { scrollTo } from '@/utils/scroll-to';
  18. import { propTypes } from '@/utils/propTypes';
  19. const props = defineProps({
  20. total: propTypes.number,
  21. page: propTypes.number.def(1),
  22. limit: propTypes.number.def(20),
  23. pageSizes: { type: Array<number>, default: () => [10, 20, 30, 50] },
  24. // 移动端页码按钮的数量端默认值5
  25. pagerCount: propTypes.number.def(document.body.clientWidth < 992 ? 5 : 7),
  26. layout: propTypes.string.def('total, sizes, prev, pager, next, jumper'),
  27. background: propTypes.bool.def(true),
  28. autoScroll: propTypes.bool.def(true),
  29. hidden: propTypes.bool.def(false),
  30. float: propTypes.string.def('right')
  31. });
  32. const emit = defineEmits(['update:page', 'update:limit', 'pagination']);
  33. const currentPage = computed({
  34. get() {
  35. return props.page;
  36. },
  37. set(val) {
  38. emit('update:page', val);
  39. }
  40. });
  41. const pageSize = computed({
  42. get() {
  43. return props.limit;
  44. },
  45. set(val) {
  46. emit('update:limit', val);
  47. }
  48. });
  49. function handleSizeChange(val: number) {
  50. if (currentPage.value * val > props.total) {
  51. currentPage.value = 1;
  52. }
  53. emit('pagination', { page: currentPage.value, limit: val });
  54. if (props.autoScroll) {
  55. scrollTo(0, 800);
  56. }
  57. }
  58. function handleCurrentChange(val: number) {
  59. emit('pagination', { page: val, limit: pageSize.value });
  60. if (props.autoScroll) {
  61. scrollTo(0, 800);
  62. }
  63. }
  64. </script>
  65. <style lang="scss" scoped>
  66. .pagination-container {
  67. .el-pagination {
  68. float: v-bind(float);
  69. }
  70. }
  71. .pagination-container.hidden {
  72. display: none;
  73. }
  74. </style>