index.vue 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. <!-- 基于 ruoyi-vue3 的 Pagination 重构,核心是简化无用的属性,并使用 ts 重写 -->
  2. <template>
  3. <el-pagination
  4. v-show="total > 0"
  5. v-model:current-page="currentPage"
  6. v-model:page-size="pageSize"
  7. :background="true"
  8. :page-sizes="[10, 20, 30, 50, 100]"
  9. :pager-count="pagerCount"
  10. :total="total"
  11. class="float-right mt-15px mb-15px"
  12. layout="total, sizes, prev, pager, next, jumper"
  13. @size-change="handleSizeChange"
  14. @current-change="handleCurrentChange"
  15. />
  16. </template>
  17. <script name="Pagination" setup>
  18. import { computed } from 'vue'
  19. const props = defineProps({
  20. // 总条目数
  21. total: {
  22. required: true,
  23. type: Number
  24. },
  25. // 当前页数:pageNo
  26. page: {
  27. type: Number,
  28. default: 1
  29. },
  30. // 每页显示条目个数:pageSize
  31. limit: {
  32. type: Number,
  33. default: 20
  34. },
  35. // 设置最大页码按钮数。 页码按钮的数量,当总页数超过该值时会折叠
  36. // 移动端页码按钮的数量端默认值 5
  37. pagerCount: {
  38. type: Number,
  39. default: document.body.clientWidth < 992 ? 5 : 7
  40. }
  41. })
  42. const emit = defineEmits(['update:page', 'update:limit', 'pagination', 'pagination'])
  43. const currentPage = computed({
  44. get() {
  45. return props.page
  46. },
  47. set(val) {
  48. // 触发 update:page 事件,更新 limit 属性,从而更新 pageNo
  49. emit('update:page', val)
  50. }
  51. })
  52. const pageSize = computed({
  53. get() {
  54. return props.limit
  55. },
  56. set(val) {
  57. // 触发 update:limit 事件,更新 limit 属性,从而更新 pageSize
  58. emit('update:limit', val)
  59. }
  60. })
  61. const handleSizeChange = (val) => {
  62. // 如果修改后超过最大页面,强制跳转到第 1 页
  63. if (currentPage.value * val > props.total) {
  64. currentPage.value = 1
  65. }
  66. // 触发 pagination 事件,重新加载列表
  67. emit('pagination', { page: currentPage.value, limit: val })
  68. }
  69. const handleCurrentChange = (val) => {
  70. // 触发 pagination 事件,重新加载列表
  71. emit('pagination', { page: val, limit: pageSize.value })
  72. }
  73. </script>