You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3组合式API(TS)中默认Props未生效,值为undefined

问题原因

你当前的写法是给整个config对象设置默认值,只有当父组件完全不传递config时,才会启用这个完整的默认对象。一旦父组件传递了包含部分属性的config(哪怕只传了urls和labels),Vue就会直接使用这个传入的对象,不会自动合并默认对象里的switchView、activeView等嵌套属性。

解决方案

方案1:拆分嵌套属性为独立Props(推荐,更符合Vue Prop设计)

把config内部的属性拆成单独的Prop,这样每个属性都能独立设置默认值,Vue会自动处理单个属性的默认值生效逻辑:

interface Props {
  switchView?: boolean;
  activeView?: number;
  urls: { someUrl: string };
  labels?: { someLabel: string };
}

const props = withDefaults(defineProps<Props>(), {
  switchView: true,
  activeView: 0,
  labels: () => ({ someLabel: '' })
});

父组件调用时直接传递对应属性即可:

// 父组件代码
const urls = { someUrl: '/example' };
const labels = { someLabel: 'Example label' };
<!-- 父组件模板 -->
<YourComponent :urls="urls" :labels="labels" />

方案2:手动合并默认值(保留config嵌套结构)

如果必须保留config对象结构,需要在组件内部手动将传入的config和预设的默认配置合并,确保缺失的属性补全默认值:

interface Props {
  config?: {
    switchView?: boolean;
    activeView?: number;
    urls?: { someUrl: string };
    labels?: { someLabel: string };
  };
}

// 定义基础默认配置
const defaultConfig = {
  switchView: true,
  activeView: 0,
  urls: { someUrl: '' },
  labels: { someLabel: '' }
};

// 给config设置空对象作为默认,确保即使不传也能进入合并逻辑
const props = withDefaults(defineProps<Props>(), {
  config: () => ({})
});

// 递归合并嵌套对象,避免直接覆盖整个子对象
const mergedConfig = {
  ...defaultConfig,
  ...props.config,
  urls: { ...defaultConfig.urls, ...props.config?.urls },
  labels: { ...defaultConfig.labels, ...props.config?.labels }
};

之后组件内部使用mergedConfig即可获取包含默认值的完整配置。

内容的提问来源于stack exchange,提问作者Bushima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 01:47:15