注意:这些语法糖是建立在<script setup>上的
以封装element-plus Pagination 分页组件
子组件获取到父组件的值用defineEmit,
子组件给父组件传值用defineProps
子组件暴露自己的数据和方法用defineExpose
直接上完整代码
子组件:
<template>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="sizes, prev, pager, next, jumper"
:total="props.total"
></el-pagination>
</template>
<script setup lang="ts">
const num = 1;
interface Props {
total: number;
currentPage: number;
pageSize: number;
}
const props = withDefaults(defineProps<Props>(), {
total: 0,
currentPage: 1,
pageSize: 10,
});
const emit = defineEmits<{
(e: "pageSizeChange", val: number): void;
(e: "pageChange", val: number): void;
}>();
// 没有ts类型声名
// const props = defineProps({
// total: {
// type: Number,
// default: 0,
// },
// currentPage: {
// type: Number,
// default: 1,
// },
// pageSize: {
// type: Number,
// default: 10,
// },
// });
// const emit = defineEmits(["pageSizeChange", "pageChange"]);
const handleSizeChange = (val: any) => {
emit("pageSizeChange", val);
};
const handleCurrentChange = (val: any) => {
emit("pageChange", val);
};
// 暴露数据和方法给父组件
defineExpose({
num,
handleSizeChange,
});
</script>
<style scoped>
</style>
父组件:
<template>
<page
ref="pagechild"
:total="state.pageInfo.total"
:currentPage="state.pageInfo.currentPage"
:pageSize="state.pageInfo.pageSize"
@pageChange="pageChange"
@pageSizeChange="pageSizeChange"
></page>
</template>
<script setup lang="ts" name="simpleTemp">
import {
reactive,
ref,
toRefs,
onBeforeMount,
onActivated,
} from "vue";
const state = reactive({
pageInfo: {
currentPage: 1,
total: 0,
pageSize: 10,
},
})
const pageSizeChange = (val: number) => {
state.pageInfo.pageSize = val;
state.pageInfo.currentPage = 1;
getTableList();
};
const pageChange = (val: number) => {
state.pageInfo.currentPage = val;
getTableList();
};
</script>
<style scoped>
</style>