index.vue 1.63 KB
<script setup lang="ts">
/**
 * 单个图片上传公共组件
 * @module Pagination
 * @author Tengxi
 */

// TIP 每个属性都必传,不带默认值
// defineProps<{
//   total: number;
//   currentPage: number;
//   pageSizes: number[];
//   pageSize: number;
// }>();

/**
 * @description 组件属性
 * @prop {number} total 内容总条数
 * @prop {number[] | null} pageSizes 每页显示个数选择器的选项设置
 * @prop {number | null} pageSize 当前每页内容条数
 * @prop {number | null} currentPage 当前页码
 * @prop {string | null} tagName 标签
 */
// TIP 可以带默认值
interface Props {
  total: number;
  pageSizes?: number[];
  pageSize?: number;
  currentPage?: number;
  tagName?: string;
}
const props = withDefaults(defineProps<Props>(), {
  total: 0,
  pageSizes: () => [10, 20, 50, 100],
  pageSize: 10,
  currentPage: 1,
});

/**
 * @method handleSizeChange
 * @description 每页内容条数变化响应
 */
const handleSizeChange = (val) => {
  emit("pageChange", props.currentPage, val, props.tagName);
};
/**
 * @method handleCurrentChange
 * @description 当前页码变化响应
 */
const handleCurrentChange = (val) => {
  emit("pageChange", val, props.pageSize, props.tagName);
};
const emit = defineEmits<{
  (e: "pageChange", curPage: number, curSize: number, tagName: string): void;
}>();
</script>

<template>
  <el-pagination
    v-model:currentPage="currentPage"
    :page-sizes="pageSizes"
    :page-size="pageSize"
    layout="total, sizes, prev, pager, next, jumper"
    :total="total"
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
  >
  </el-pagination>
</template>