在 Vue 3 中,defineProps 和 defineEmits 是组合式 API 的核心功能,用于处理父子组件之间的传值和事件通信。
1. defineProps
defineProps 用于定义并接收父组件传递过来的数据(props)。它是在子组件中使用的,接收的数据可以是各种类型。
// 子组件
<template>
<div>
<h1>title:{{ title }}</h1>
<p>count:{{ count }}</p>
</div>
</template>
<script setup>
import { defineProps } from 'vue'
// 接收父组件传递的 props
const props = defineProps({
title: String,
count: Number
})
</script>
// 父组件
<template>
<Child title="Hello, World!" :count="10" />
</template>
<script setup>
import Child from './Child.vue';
</script>
2. defineEmits
defineEmits 用于定义并触发子组件向父组件发送的事件。父组件可以通过监听这些事件来执行相应的操作。
<!-- 父组件 -->
<template>
<Child @update="handleUpdate" />
</template>
<script setup>
import Child from './Child.vue';
// 处理子组件传来的事件
const handleUpdate = (value) => {
console.log('Updated value from child:', value);
};
</script>
<!-- 子组件 -->
<template>
<button @click="sendUpdate">Click to Update</button>
</template>
<script setup>
import { defineEmits } from 'vue';
// 定义事件
const emit = defineEmits(['update']);
const sendUpdate = () => {
emit('update', 'new value'); // 触发 update 事件并传递参数
};
</script>
3. 使用 TypeScript 定义类型
在 Vue 3 中结合 TypeScript 时,defineProps 和 defineEmits 可以使用更严格的类型检查,提升代码的健壮性。
// 子组件
<script setup lang="ts">
import { defineProps, defineEmits } from 'vue';
// 定义 props 的类型
const props = defineProps<{
title: string;
count: number;
}>();
// 定义 emit 的事件和类型
const emit = defineEmits<{
(event: 'update', newTitle: string): void;
}>();
const updateTitle = () => {
emit('update', 'New Title with TS'); // 触发事件并传递参数
};
</script>