Vue3 组件通信(defineProps 和 defineEmits )

Vue3 组件通信(defineProps 和 defineEmits )

defineProps 和 defineEmits 这两个是 Vue 3 中 <script setup>语法糖特有的 "编译宏" ,专门用于组件通信(父→子、子→父),是组合式 API 里定义props自定义事件的标准方式,不用手动导入,直接在<script setup>中使用。

1. defineProps:定义组件的 "入参(父传子数据)"

作用是声明当前组件接收的 props(父组件传递给子组件的数据),同时支持类型校验、默认值等配置,让子组件明确能接收哪些数据。

基础用法(示例):
javascript 复制代码
<!-- 子组件 Child.vue -->

<script setup>

// 声明接收的props:类型+默认值

const props = defineProps({

 // 接收父组件传递的title,类型是字符串

 title: {

   type: String,

   required: true // 必传

 },

 // 接收父组件传递的count,类型是数字,默认值0

 count: {

   type: Number,

   default: 0

 }

});

// 直接使用props里的数据

console.log(props.title); // 父组件传递的title

</script>

<template>

 <div>{{ title }} - 数量:{{ count }}\</div>

</template>
父组件如何传递:
javascript 复制代码
<!-- 父组件 Parent.vue -->

<template>

 <!-- 向子组件传递title和count -->

 <Child title="我是父组件传递的标题" :count="10" />

</template>

2. defineEmits:定义组件的 "自定义事件(子传父通信)"

作用是声明当前组件可以触发的自定义事件 ,子组件通过emit触发事件,父组件监听事件并接收子组件传递的数据,实现 "子→父" 的通信。

基础用法(示例):
javascript 复制代码
<!-- 子组件 Child.vue -->

<script setup>

// 声明当前组件支持的自定义事件(数组形式:事件名列表)

const emit = defineEmits(\['changeCount', 'submit']);

// 子组件内部触发事件,并传递数据给父组件

const handleClick = () => {

 // 触发changeCount事件,传递参数10

 emit('changeCount', 10);

};

const handleSubmit = () => {

 // 触发submit事件,传递表单数据

 emit('submit', { name: '测试' });

};

</script>

<template>

 <button @click="handleClick">修改数量\</button>

 <button @click="handleSubmit">提交\</button>

</template>
父组件如何监听:
javascript 复制代码
<!-- 父组件 Parent.vue -->

<template>

 <!-- 监听子组件的changeCount和submit事件 -->

 <Child

   title="测试标题"

   @changeCount="newCount => console.log('子组件传递的数量:', newCount)"

   @submit="formData => console.log('子组件提交的表单:', formData)"

 />

</template>

核心总结

函数名 作用 通信方向 场景
defineProps 声明组件接收的 props 父→子 父组件给子组件传数据
defineEmits 声明组件可触发的自定义事件 子→父 子组件向父组件传递数据 / 通知