Angular服务注入后为什么在组件里拿不到数据?
我在Angular里写了个UserService,用HttpClient去请求用户信息,但在组件里调用时总是返回undefined,明明控制台能看到网络请求成功了啊。
我试过把subscribe里的逻辑直接写在service里,也试过用async/await,但组件里还是拿不到值。是不是我哪里搞错了?
<template>
<div>{{ userInfo?.name }}</div>
</template>
<script setup>
import { onMounted } from 'vue'
import { inject } from 'vue'
const userService = inject('userService')
let userInfo
onMounted(() => {
userService.getUser().then(res => {
userInfo = res
})
})
</script>
首先在Vue组件中使用inject获取的服务实例是没问题的,但问题出在你如何处理异步数据上。Vue 3的响应式系统需要明确知道什么时候数据更新了,而在你的代码里,userInfo这个变量并没有被声明为响应式的。
这里是一个修正后的完整实现:
为什么这样做呢?因为Vue 3的响应式系统需要通过特殊的机制来追踪数据的变化。当你直接对普通变量赋值时,Vue无法检测到这种变化。而使用ref或reactive创建的响应式对象,当内部值发生变化时,Vue能够自动追踪并更新视图。
另外要注意的是,在模板中访问userInfo时,已经不需要额外的判断,因为ref会自动处理undefined的情况。
顺便说一句,如果你还在使用Angular的服务逻辑,记得确认service里的getUser方法确实返回了一个Promise,而不是直接返回数据或者Observable。这可能是另一个容易忽略的地方。
有时候开发到晚上脑子都不太清醒了,这些小细节最容易被忽视,我自己也踩过不少坑呢。
我的做法是把 userInfo 定义成一个 ref 或者 reactive 变量。这样当数据更新时,视图才能自动刷新。你试试这样改:
记得在模板里用 userInfo.value 访问数据的时候加上 ?. 操作符,确保数据加载前不会报错。
另外一个小建议:虽然你用了 inject 获取服务,但最好还是通过依赖注入的方式在组件中声明 UserService。这样更符合 Angular 的规范,调试起来也方便些。
说真的,这种数据绑定的问题我以前也踩过不少坑,特别是刚从 AngularJS 过来的时候。希望这能帮你解决问题!