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

React项目无法展示Spoonacular API数据且出现重复请求问题

问题根源&修复方案

1. 接口无限调用、重复打印多条数据的原因

你的useEffect依赖数组中传入了food状态:每次请求完成调用setFood更新food后,会触发useEffect重新执行,再次发起接口请求,形成死循环,所以每次都会拿到新的随机食物数据、重复打印。
同时setFood是异步更新方法,调用setFood后立刻打印food拿到的是更新前的旧状态,不符合调试预期。

2. 食物标题无法显示的原因

spoonacular随机菜谱接口的返回结构如下:

{
  "recipes": [
    { /* 单条菜谱数据,包含title等字段 */ }
  ]
}

你直接把完整返回对象response.data存入了food,这个对象本身没有title字段,title在recipes数组的第一项中,所以子组件取值为空。


完整修复代码

Home.js修改后

import React, { useEffect, useState } from "react";
import axios from "axios";
import Recipe from "../components/Recipes";

// 注意实际代码中把&替换为&,此处是原代码HTML转义导致的问题
const URL = `https://api.spoonacular.com/recipes/random?apiKey=${APIKey}&number=1`;

function Home() {
  // 初始值设为null方便后续条件判断
  const [food, setFood] = useState(null);
  // 依赖数组改为空,仅组件挂载时请求一次
  useEffect(() => {
    axios
      .get(URL)
      .then(function (response) {
        // 直接取返回的菜谱数组第一项
        setFood(response.data.recipes[0]);
        // 要调试打印直接打接口返回值即可
        console.log(response.data.recipes[0]);
      })
      .catch(function (error) {
        console.warn(error);
      });
  }, []);

  // 数据未返回时可以显示加载态
  if (!food) return <main>加载中...</main>

  return (
    <main>
      <Recipe recipeList={food} />
    </main>
  );
}

export default Home;

Recipe.js兼容优化(可选)

加可选链避免取值报错:

import React from "react";

function Recipe({ recipeList }) {
  return (
    <div className="recipeCard">
      <h1>{recipeList?.title}</h1>
    </div>
  );
}

export default Recipe;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:09:04