You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React访问API数据quoteData[0].text报Uncaught TypeError怎么办

报错原因
  • useEffect内的接口请求是异步执行的,组件首次挂载渲染时,请求还未返回,此时quoteData的值是你初始化时传入的空对象{}
  • 对空对象取索引0得到的是undefined,直接读取undefined的.text属性就会触发类型错误
  • 你当前的逻辑把整个接口返回的名言数组全存在了state里,没有做随机筛选逻辑,即使解决报错也无法实现随机生成名言的需求
修复步骤
  • 修正state初始值:接口返回的是数组类型,初始值不要设为空对象,改为空数组[],保持类型一致
  • 增加兜底判断:数据加载完成前不要读取数组内容,可以加加载态提示,或者用可选链操作符?.做安全访问
  • 补充随机取值逻辑:拿到完整名言数组后,生成随机索引取出单条名言用于展示
可直接运行的修正代码
import { useState, useEffect } from 'react';

function App() {
  // 初始值改为空数组,匹配接口返回的数组结构
  const [quoteList, setQuoteList] = useState([]);
  const [activeQuote, setActiveQuote] = useState(null);

  // 随机切换名言的方法
  const switchRandomQuote = () => {
    const randomIdx = Math.floor(Math.random() * quoteList.length);
    setActiveQuote(quoteList[randomIdx]);
  }

  useEffect(() => {
    fetch('https://type.fit/api/quotes')
      .then(res => res.json())
      .then(data => {
        setQuoteList(data);
        // 首次拿到数据后生成第一条随机名言
        const randomIdx = Math.floor(Math.random() * data.length);
        setActiveQuote(data[randomIdx]);
      })
  }, []);

  // 数据未加载完成时展示加载提示
  if (!activeQuote) {
    return <div>加载中...</div>
  }

  return (
    <div>
      <p>{activeQuote.text}</p>
      <p>—— {activeQuote.author ?? '佚名'}</p>
      <button onClick={switchRandomQuote}>换一条名言</button>
    </div>
  )
}

export default App;

如果你不想单独存当前展示的名言,也可以在渲染时直接用可选链兜底,比如写{quoteList[0]?.text},但这种方式在数据加载前会显示空白,体验不如单独加加载态友好。

内容的提问来源于stack exchange,提问作者Mohamed123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:33:34