setup中拿不到注入值是因为其执行时组件尚未挂载,provide/inject绑定未完成,inject返回初始值;应在onMounted或用computed/watch延迟读取以确保获取真实响应式数据。

注入的数据在组件挂载后、首次渲染完成时才真正可用,不是在 setup() 执行阶段。
为什么 setup 里拿不到注入值?
setup() 是 Vue 组件的初始化函数,在组件实例创建但尚未挂载(beforeMount之前)就执行。此时 provide/inject 尚未完成绑定——父组件的 provide 还没被子组件 inject 识别,inject 返回的始终是初始值(如 undefined 或你传的默认值),不是最终注入的真实数据。
安全获取注入数据的时机
- 在 onMounted 钩子中访问:此时组件已挂载,inject 已解析完成,能拿到真实值
- 用 computed 或 watch 包裹 inject 值:Vue 会自动追踪响应式变化,一旦注入值就绪即触发更新
- 避免在 setup 内直接解构或赋值 inject 结果:例如 const { api } = inject('context') —— 这行代码在 setup 里执行时 api 仍是 undefined
推荐写法示例
✅ 正确(延迟读取):
setup() {<br> const context = inject('context') // 先不拆,保持响应式引用<br> onMounted(() => {<br> console.log(context?.api) // 此时确保可用<br> })<br> return () => h('div', context?.user?.name || 'Loading...')<br>}
✅ 更健壮(自动响应):
setup() {<br> const context = inject('context')<br> const api = computed(() => context?.api)<br> watch(api, (newApi) => { if (newApi) fetchData(newApi) })<br> return { api }<br>}
额外提醒
如果注入的是响应式对象(比如 reactive 或 ref),务必确保父组件 provide 的是原始响应式源,而非解构后的普通属性——否则子组件 inject 到的将失去响应性。

















