index.vue 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <div :class="{ 'hidden': hidden }" class="pagination-container">
  3. <el-pagination
  4. :background="background"
  5. v-model:current-page="currentPage"
  6. v-model:page-size="pageSize"
  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 as PropType<number[]>,
  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. padding: 32px 16px;
  76. .el-pagination{
  77. float: v-bind(float);
  78. }
  79. }
  80. .pagination-container.hidden {
  81. display: none;
  82. }
  83. </style>