index.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 lang="ts">
  17. export default {
  18. name: 'Pagination'
  19. };
  20. </script>
  21. <script setup lang="ts">
  22. import { scrollTo } from '@/utils/scroll-to';
  23. import { propTypes } from '@/utils/propTypes';
  24. const props = defineProps({
  25. total: propTypes.number,
  26. page: propTypes.number.def(1),
  27. limit: propTypes.number.def(20),
  28. pageSizes: {
  29. type: Array,
  30. default: () => [10, 20, 30, 50]
  31. },
  32. // 移动端页码按钮的数量端默认值5
  33. pagerCount: propTypes.number.def(document.body.clientWidth < 992 ? 5 : 7),
  34. layout: propTypes.string.def('total, sizes, prev, pager, next, jumper'),
  35. background: propTypes.bool.def(true),
  36. autoScroll: propTypes.bool.def(true),
  37. hidden: propTypes.bool.def(false),
  38. float: propTypes.string.def('right')
  39. });
  40. const emit = defineEmits(['update:page', 'update:limit', 'pagination']);
  41. const currentPage = computed({
  42. get() {
  43. return props.page;
  44. },
  45. set(val) {
  46. emit('update:page', val);
  47. }
  48. });
  49. const pageSize = computed({
  50. get() {
  51. return props.limit;
  52. },
  53. set(val) {
  54. emit('update:limit', val);
  55. }
  56. });
  57. function handleSizeChange(val: number) {
  58. if (currentPage.value * val > props.total) {
  59. currentPage.value = 1;
  60. }
  61. emit('pagination', { page: currentPage.value, limit: val });
  62. if (props.autoScroll) {
  63. scrollTo(0, 800);
  64. }
  65. }
  66. function handleCurrentChange(val: number) {
  67. emit('pagination', { page: val, limit: pageSize.value });
  68. if (props.autoScroll) {
  69. scrollTo(0, 800);
  70. }
  71. }
  72. </script>
  73. <style lang="scss" scoped>
  74. .pagination-container {
  75. display: flex;
  76. justify-content: flex-end;
  77. padding: 10px 30px;
  78. }
  79. .pagination-container.hidden {
  80. display: none;
  81. }
  82. </style>