开发者问题收集

获取 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