在 Vue 3 中,除了运行时声明这种常见方式,还可以通过基于类型的声明、解构赋值等方式来接收 props
,下面为你详细介绍:
1. 基于类型的声明
这种方式借助 TypeScript 的类型系统来定义 props
,具有类型检查和代码提示的优势,让代码更加健壮和易于维护。
示例代码
TypeScript
<template>
<div>
<p>用户名: {{ username }}</p>
<p>是否活跃: {{ isActive }}</p>
</div>
</template>
<script setup lang="ts">
// 定义 Props 接口来描述 props 的类型
interface Props {
username: string;
isActive?: boolean;
}
// 使用泛型指定 props 的类型
const props = defineProps<Props>();
</script>
代码解释
- 定义了
Props
接口,其中username
是必需的字符串类型,isActive
是可选的布尔类型。 defineProps<Props>()
通过泛型指定props
的类型,从而完成props
的接收。
2. 解构赋值
可以对 defineProps
返回的 props
对象进行解构赋值,方便在模板中直接使用 props
。不过需要注意的是,直接解构会失去响应式,可使用 toRefs
来解决这个问题。
示例代码
TypeScript
<template>
<div>
<p>标题: {{ title }}</p>
<p>描述: {{ description }}</p>
</div>
</template>
<script setup>
import { toRefs } from 'vue';
// 运行时声明 props
const props = defineProps({
title: {
type: String,
required: true
},
description: {
type: String,
default: '暂无描述'
}
});
// 使用 toRefs 解构 props 以保持响应式
const { title, description } = toRefs(props);
</script>
代码解释
- 首先使用运行时声明的方式定义
props
。 - 然后使用
toRefs
对props
进行解构,这样title
和description
就保持了响应式,当父组件传递的props
发生变化时,子组件能够相应更新。
3. 结合 withDefaults
辅助函数
withDefaults
辅助函数可用于给基于类型声明的 props
设置默认值,增强了类型声明方式的灵活性。
示例代码
TypeScript
<template>
<div>
<p>颜色: {{ color }}</p>
<p>大小: {{ size }}</p>
</div>
</template>
<script setup lang="ts">
import { withDefaults } from 'vue';
interface Props {
color: string;
size?: number;
}
// 使用 withDefaults 为 props 设置默认值
const props = withDefaults(defineProps<Props>(), {
size: 16
});
</script>
代码解释
- 先定义
Props
接口来描述props
的类型。 - 使用
withDefaults
函数包裹defineProps<Props>()
,并传入一个对象来设置默认值,这里为size
设置了默认值16
。