inject 第二个参数设默认值是防止上层漏 provide 导致崩溃的关键防线,支持字符串、对象、ref 等类型;涉及副作用时须用工厂函数惰性初始化;TS 下应结合类型与默认值保障安全,Symbol 键名同理需兜底。
直接在 inject 的第二个参数传入默认值,是最简单也最必要的兜底方式。它不是“锦上添花”,而是防止因上层漏掉 provide 导致整个组件崩溃的关键防线。
只要 inject 有第二个参数,无论上层有没有 provide,都不会返回 undefined,而是直接返回你指定的默认值:
const message = inject('message', '暂无通知') → 返回字符串const user = inject('user', { name: '游客', role: 'guest' }) → 返回普通对象const theme = inject('theme', ref('light')) → 返回 ref,保持响应性一致,后续可直接解构或 .value 使用如果默认值涉及创建实例、发起请求或执行耗时逻辑,必须用函数包裹,否则会在每次 setup 执行时重复运行:
inject('api', createApiClient()) → 每次组件初始化都新建一次 clientinject('api', () => createApiClient()) → 仅当真正未提供时才调用,惰性初始化inject('list', () => reactive([]))、inject('config', () => ({ lang: 'zh-CN' }))
类型标注配合默认值,能让 IDE 提示更准、编译期报错更早:
const count = inject>('count', ref(0)) → 明确类型,且默认值也是 ref
const store = inject('store', () => new Store()) → 类型约束 + 工厂函数,比 {} as Store 更可靠as 强制断言,默认值本身应天然符合类型预期用 Symbol 做注入名是为了避免命名冲突,但并不会自动保证一定被提供。它的行为和字符串 key 完全一致:
const themeKey = Symbol('theme')const theme = inject(themeKey, { primary: '#409eff', dark: false })