Vue中props默认值仅在传入undefined时生效,因内部严格比较val===undefined;null、''、false、0等假值均不触发,默认值被跳过。

Vue 中 Props 默认值只在传入 undefined 时生效,而不是所有“假值”(如 null、''、false、0),这是由 Vue 的内部初始化逻辑决定的。默认值失效,往往是因为你传了其他“非 undefined”的值,而非 Vue 本身出了问题。
为什么只有 undefined 触发默认值?
Vue 在初始化 props 时,会逐个检查每个 prop 的传入值是否为 undefined。只有严格等于 undefined(val === undefined),才会回退到 default 函数或值。它不会做类型转换或“falsy 判断”,所以:
-
null≠undefined→ 不触发默认值 -
''(空字符串)≠undefined→ 不触发 -
false、0同理,都会被原样接收
常见导致“默认值失效”的误操作
你以为没传值,其实悄悄传了别的东西:
-
模板中写了
:prop-name="null"或:prop-name="''":绑定表达式求值结果不是undefined,默认值跳过 -
父组件用
v-bind扩展对象,其中 key 存在但值为null:例如v-bind="{ title: null, desc: 'xxx' }",title 会被设为null -
解构赋值时默认值写在父组件,而非子组件 props 定义里:比如
const { title = '默认' } = props是 JS 层面的兜底,和 Vue 的 props 默认值机制无关 -
使用
setup+defineProps时,用withDefaults包裹,但调用方式不对:必须是withDefaults(defineProps(...), {...}),顺序/嵌套错误会导致默认值不注册
如何快速验证是否真没传 undefined?
在子组件中加一行调试:
console.log('title received:', props.title, 'type:', typeof props.title)
重点看输出是不是 undefined。如果不是,再往上查父组件模板或数据来源。
可靠兜底建议(不止靠 props default)
如果业务上希望 null、空字符串等也走默认逻辑,不要只依赖 props default:
- 在
computed或setup中二次处理:const finalTitle = computed(() => props.title ?? '默认标题') - 使用
withDefaults时,配合函数式 default 返回更灵活的判断:default: () => '默认'(适用于静态值)default: (props) => props.id ? `item-${props.id}` : '未知项'(Vue 3.4+ 支持带参 default) - 模板中直接用空值合并符:
{{ props.title || '默认' }}(注意:0 和 false 也会被替换,慎用)


















