defineProps 中 required: true 必须配合 type 使用且仅支持对象声明,可触发运行时校验;TS 类型标注能提前拦截漏传,二者可共存实现双重防护。

在 defineProps 中配置 required: true 是保障子组件接收关键数据不为空的最直接方式,它会在 Vue 运行时自动检查父组件是否传入该 prop,未传则控制台报错并中断渲染,避免后续逻辑因 undefined 崩溃。
必须用对象形式声明,不能用数组写法
数组写法(如 defineProps(['title']))完全不支持 required,所有 prop 默认可选。只有对象形式才能启用校验:
-
正确写法:
title: { type: String, required: true } -
错误写法:
defineProps(['title'])—— 此时即使父组件漏传,也不会警告
required 和 type 要同时存在才有效
required: true 必须配合 type 字段使用,否则 Vue 无法判断“该传什么”,校验会失效:
- ✅ 支持:
id: { type: Number, required: true } - ✅ 支持:
user: { type: Object, required: true } - ❌ 无效:
id: { required: true }(缺少 type,Vue 忽略 required)
多个必填项可集中管理,结构清晰
当组件依赖多个核心字段时,把它们统一设为 required: true,便于维护和排查:
- 例如用户卡片组件必须有
name、avatar、role才能展示:name: { type: String, required: true },<br>avatar: { type: String, required: true },<br>role: { type: String, required: true } - 父组件漏传任一字段,控制台立刻提示类似:
"[Vue warn]: Missing required prop: 'avatar'"
搭配 TypeScript 可提前拦截,更进一步防护
如果项目已启用 TS,推荐用类型标注替代运行时校验,让错误出现在编码阶段:
-
defineProps<{ title: string; id: number }>()—— 没问号即表示必填 - 此时 VS Code 会高亮提示“Property 'title' is missing”,父组件模板中未传就会编译失败
- 比
required: true更早发现问题,但两者不冲突,可共存作为双重保险


















