我很困惑。我想要一个简单的通用获取函数来学习它的基本,但我想做它与Vue组合API和脚本设置。
这是我的剧本:
<script setup>
import {ref} from 'vue';
const boredInfo = ref(null)
function theData(url) {
fetch(url)
.then(response => response.json())
.then(actualData => {
console.log(actualData)
boredInfo.value = actualData
})
.catch((e) => {
console.error('Das ist der Catch Error: ', e)
})
return boredInfo
}
theData('https://www.boredapi.com/api/activity')
</script>
这是我的模板
<template>
<h1>Lets go!</h1>
<div>
<h1>Aktivität: {{boredInfo.activity}}</h1>
</div>
</template>
我得到的错误:
ypeError: Cannot read properties of null (reading 'activity')
JSON我懂了
{
"activity": "Make your own LEGO creation",
"type": "recreational",
"participants": 1,
"price": 0,
"link": "",
"key": "1129748",
"accessibility": 0.1
}
就这么简单...在整个互联网上我找不到一个解决方案的脚本设置,获取API和显示的价值。
但最令人困惑的是:它显示的值!那么为什么这个错误?
3条答案
按热度按时间w8rqjzmb1#
我想你忘了下面的代码:
它在你的API调用完成之前就已经调用了。所以...简单的解决方案是你可以在div或h1里面添加v-if来检查变量是否已经被api响应填充了。这是主要的问题,所以解决方案的多样性取决于你。
tp5buhyn2#
问题在于,您在提取完成之前访问了
boredInfo.activity
,而此时boredInfo
仍然只是ref(null)
。或者用预期的结构初始化它,即
或者避免过早访问
v-if
、表达式中的三进制、可选链接(?.
)等。你可以在加载时显示加载微调器,这总是很好的。
uujelgoq3#
我想解释一下为什么会出现错误
Cannot read properties of null (reading 'activity')
首先,您试图访问一个在组件挂载时不存在的属性,
activity
属性在boredInfo
对象中不存在,因此当组件呈现时,它不会期望加载该属性。我们可以用两种方法来解决这个问题,第一种方法非常简单,在
const boredInfo = ref()
中添加属性名,如下所示:此设置将忽略错误。
另一个选项是在数据尚未加载时添加加载,这意味着它将等待我们的
theData
方法解析,首先定义一个新变量,用于指示加载状态:然后,我们将使用async/await等待
fetch
方法生成的承诺,然后将load值更改为false,因为所有数据都将被加载:然后我们用一个
v-if
来配置我们的模板,等待isLoading
为false,以显示API的返回值:就这样,就是这样!
您可以在这里看到一个真实的例子