vue3语法糖<script setup>,父子组件通信 使用defineEmit,defineProps,defineExpose

该博客介绍了如何在Vue3中利用<script setup>语法糖来封装Element Plus的Pagination分页组件。子组件通过defineProps接收父组件传递的总条数、当前页和每页大小,并通过defineEmits向父组件发送'pageSizeChange'和'pageChange'事件。同时,子组件使用defineExpose暴露出关键方法。在父组件中,监听这些事件并更新状态。博客展示了具体的代码实现,帮助读者理解Vue3组件间的通信和封装技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:这些语法糖是建立在<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>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值