实现思路
- 父组件:定义数据并传递给子组件,通过
defineProps
来接收和类型检查。
- 子组件:使用
defineProps
接收父组件传递的props
并进行类型声明;通过defineEmits
声明要触发的事件并进行类型检查,在需要时触发事件通知父组件。
关键代码示例
父组件
<template>
<div>
<ChildComponent :message="parentMessage" @child-event="handleChildEvent"/>
</div>
</template>
<script setup lang="ts">
import ChildComponent from './ChildComponent.vue';
import { ref } from 'vue';
const parentMessage = ref('Hello from parent');
const handleChildEvent = (data: string) => {
console.log('Received from child:', data);
};
</script>
子组件
<template>
<button @click="sendEvent">Send Event</button>
</template>
<script setup lang="ts">
const props = defineProps<{
message: string;
}>();
const emit = defineEmits<{
(e: 'child-event', data: string): void;
}>();
const sendEvent = () => {
emit('child-event', 'Hello from child');
};
</script>
相较于Vue 2的优势
- 类型安全:Vue 3 + TypeScript能在开发阶段就发现类型错误,Vue 2在处理复杂组件通信时容易出现类型相关的运行时错误。
- 代码可维护性:清晰的类型声明使代码结构更清晰,尤其是大型项目,便于理解和后续维护。
- 智能提示:编辑器能基于类型声明提供更准确的智能提示,提高开发效率。