我有一个非常简单的 Package 器组合来管理后端get请求
// inside useAxiosGet.js
import { ref, watchEffect } from 'vue';
import axios from 'axios';
export default function (url) {
const data = ref(null);
watchEffect(async () => {
axios({
url: url
})
.then((res) => {
data.value = res.data;
})
.catch((err) => console.log(err));
});
return { data };
}
使用此组合时,我在访问数据值时遇到了问题。
<script setup>
const { data } = useAxiosGet('my/path/to/backend/');
console.log(data); // logs the usual wrapper around refs, where i find my data under '_rawValue'.
console.log(isRef(data)) // logs a true - the object didnt lose reactivity while destructuring.
console.log(data.value); // logs 'null'.
</script>
我确实希望在后一个日志中得到我的数据对象。'null'让我感到困惑,考虑到数据对象确实是React性的。看起来vue内部将ref转换为React性的。但是无论如何,我应该能够通过data.dataPropertyName
访问这个对象,我不能。我没有完全看到这一点。我非常感谢任何帮助,以充分理解这里发生的事情。
2条答案
按热度按时间i2loujxw1#
我无法完全解释代码,但我发现这个问题与从后端获取数据的时间以及在组件中访问数据的时间有关。
因此,在代码
useAxiosGet
中,我看到watchEffect
钩子从后端获取数据,并在data
ref可用时更新它。此外,当安装使用此组合的组件时,
data
ref似乎仍然是null
,只是代码中的watchEffect
尚未运行并使用获取的数据更新data
ref。computed
属性访问data
watch
函数以上任何一项都可以给予您访问
wqsoz72f2#
您只需在加载
console.log()
之前使用它检查数据。更新
操场展示了你的问题。
1.数据属性定义为
const data = ref(null);
1.记录数据属性的当前值,它等于
null
,因为请求尚未完成。1.请求已完成,并且数据属性已填充请求数据。
因此,您试图在axios请求完成之前从data属性中获取值。这就是为什么
console.log(data.value);
记录'null'。playground并没有真正提供这个问题的解决方案。如果你想在数据加载后立即处理它,那么你应该使用
Promises
或async/await
。如果你想观察你的数据属性并对数据变化做出React,那么创建一个
watcher
。更新2
如果希望在请求完成后记录数据,则将
console.log(data.value)
放入.then()
中要使用这些数据,你必须等到它被加载。你可以用几种方法来做。
例如,您可以查看
isLoaded
属性。正在使用AxiosGet.js
和
和
isLoaded
的监视器我已经用
watcher
更新了Playground