index.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <template>
  2. <div :class="'pagination ' + { hidden: hidden }">
  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. :total="total"
  10. @size-change="handleSizeChange"
  11. @current-change="handleCurrentChange"
  12. />
  13. </div>
  14. </template>
  15. <script setup lang="ts">
  16. import { computed, PropType } from "vue";
  17. import { scrollTo } from "@/utils/scroll-to";
  18. const props = defineProps({
  19. total: {
  20. required: true,
  21. type: Number as PropType<number>,
  22. default: 0,
  23. },
  24. page: {
  25. type: Number,
  26. default: 1,
  27. },
  28. limit: {
  29. type: Number,
  30. default: 20,
  31. },
  32. pageSizes: {
  33. type: Array as PropType<number[]>,
  34. default() {
  35. return [10, 20, 30, 50];
  36. },
  37. },
  38. layout: {
  39. type: String,
  40. default: "total, sizes, prev, pager, next, jumper",
  41. },
  42. background: {
  43. type: Boolean,
  44. default: true,
  45. },
  46. autoScroll: {
  47. type: Boolean,
  48. default: true,
  49. },
  50. hidden: {
  51. type: Boolean,
  52. default: false,
  53. },
  54. });
  55. const emit = defineEmits(["pagination", "update:page", "update:limit"]);
  56. const currentPage = useVModel(props, "page", emit);
  57. const pageSize = useVModel(props, "limit", emit);
  58. function handleSizeChange(val: number) {
  59. emit("pagination", { page: currentPage, limit: val });
  60. if (props.autoScroll) {
  61. scrollTo(0, 800);
  62. }
  63. }
  64. function handleCurrentChange(val: number) {
  65. currentPage.value = val;
  66. emit("pagination", { page: val, limit: props.limit });
  67. if (props.autoScroll) {
  68. scrollTo(0, 800);
  69. }
  70. }
  71. </script>
  72. <style lang="scss" scoped>
  73. .pagination {
  74. padding: 12px;
  75. &.hidden {
  76. display: none;
  77. }
  78. }
  79. </style>