获取 api 后,我在 ReactJS 中看到错误“TypeError: 无法读取未定义的属性‘question’”
2021-04-23
65
我有一个名为 App 的父组件。我想将从 api 获取的数据(包括随机问题和答案)发送到子组件。在子组件(QuestionGrid)中,当我想从 api 获取数组中的第一个问题时,我遇到了错误。我想使用
console.log(items[0].question)
查看第一个问题,但它会引发错误。但是当我使用
console.log(items)
时,它允许我查看它们。我也知道在加载后获取数据。我还使用了
useEffect
。这是我的父组件
import './App.css';
import React, { useState,useEffect} from 'react';
import QuestionGrid from './components/QuestionGrid';
function App() {
const [error, setError] = useState(null);
const [isLoaded, setIsLoaded] = useState(false);
const [items, setItems] = useState([]);
useEffect(() => {
fetch("https://opentdb.com/api.php?amount=40&category=9&difficulty=medium&type=multiple")
.then(res => res.json())
.then(
(result) => {
setIsLoaded(true);
setItems(result.results);
},
(error) => {
setIsLoaded(true);
setError(error);
}
)
}, [])
return (
<div className="App">
<QuestionGrid isLoaded={isLoaded} items={items}/>
</div>
);
}
export default App;
这是我的子组件
import React, { useState, useEffect } from 'react';
export default function QuestionGrid({ isLoaded, items }) {
if(isLoaded){
console.log(items[0].question)
}
return isLoaded ?
<section className="cards">
</section> : <h1>Loading</h1>;
}
2个回答
它将触发并出错,因为
items
的初始状态是一个空数组。并且第一次渲染时
items
状态上没有索引和对象。
您可以通过仅检查其长度来检查项目是否已加载。
return items.length > 0 ? <h1>your jsx component</h1> : <span>Loading...</span>
elpmid
2021-04-23
首先,您应该在 fetch 中使用 .catch(),例如:
fetch("https://opentdb.com/api.php?amount=40&category=9&difficulty=medium&type=multiple")
.then(res => res.json())
.then((result) => {
setIsLoaded(true);
setItems(result.results);
})
.catch(error => {
setIsLoaded(true);
setError(error);
)}
)
您正在检查
isLoaded
,但没有检查是否有任何数据。您在结果和错误中都设置了
isLoaded(true)
(这并不坏)。
错误是由于 items[0] 中没有任何内容而导致的。要检查这一点,您可以调用
console.log(items?.[0].question)
,也可以在 if 条件
if(items.length > 0)
中进行检查。
Vilfred Dreijer
2021-04-23