PaginationComponent.vue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <template>
  2. <div class="demo-pagination-block" style="text-align: center; margin-top: 20px;">
  3. <el-pagination
  4. v-model:current-page="currentPage"
  5. v-model:page-size="pageSize"
  6. :page-sizes="[10, 20, 30, 40]"
  7. layout="total, sizes, prev, pager, next, jumper"
  8. :total="total"
  9. @size-change="handleSizeChange"
  10. @current-change="handleCurrentChange"
  11. />
  12. </div>
  13. </template>
  14. <script lang="ts" setup>
  15. import { ref, watch } from 'vue';
  16. // 定义 props
  17. interface Props {
  18. total: number;
  19. currentPage?: number;
  20. pageSize?: number;
  21. }
  22. const props = defineProps<Props>();
  23. // 定义 emits
  24. const emit = defineEmits<{
  25. (e: 'update:currentPage', value: number): void;
  26. (e: 'update:pageSize', value: number): void;
  27. (e: 'size-change', value: number): void;
  28. (e: 'current-change', value: number): void;
  29. }>();
  30. // 初始化 currentPage 和 pageSize
  31. const currentPage = ref<number>(props.currentPage ?? 1);
  32. const pageSize = ref<number>(props.pageSize ?? 10);
  33. // 监听 props.currentPage 变化
  34. watch(() => props.currentPage, (newVal) => {
  35. if (newVal !== undefined && newVal !== currentPage.value) {
  36. currentPage.value = newVal;
  37. }
  38. });
  39. // 监听 props.pageSize 变化
  40. watch(() => props.pageSize, (newVal) => {
  41. if (newVal !== undefined && newVal !== pageSize.value) {
  42. pageSize.value = newVal;
  43. }
  44. });
  45. // 监听 currentPage 变化并触发事件
  46. watch(currentPage, (newVal) => {
  47. emit('update:currentPage', newVal);
  48. emit('current-change', newVal);
  49. });
  50. // 监听 pageSize 变化并触发事件
  51. watch(pageSize, (newVal) => {
  52. emit('update:pageSize', newVal);
  53. emit('size-change', newVal);
  54. });
  55. // 处理页面大小变化
  56. const handleSizeChange = (newSize: number) => {
  57. pageSize.value = newSize;
  58. };
  59. // 处理当前页变化
  60. const handleCurrentChange = (newPage: number) => {
  61. currentPage.value = newPage;
  62. };
  63. </script>