React/Redux技术求助:API响应数据渲染问题
解决React渲染Yummly API食谱数组的问题
嘿,我之前在对接第三方API数据的时候也踩过一模一样的坑!这个错误的核心原因其实很直白:React没办法直接把一个完整的JavaScript对象当成页面元素渲染,你得把对象里的具体数据字段拆出来,逐个渲染才行。
咱们一步步来解决这个问题:
1. 先搞清楚API返回的结构
首先你得确认拿到的响应数据里,食谱数组到底存在哪个键下面。Yummly的API通常会返回一个包含recipes(也有可能是matches,取决于你调用的具体接口)的对象。先在控制台打印一下数据,确认清楚结构:
const data = await response.json(); console.log(data); // 看看控制台里的对象结构,找到食谱数组的键名
2. 提取数组并存储到状态里
把API返回的食谱数组提取出来,存在React状态中,方便后续渲染使用:
import { useState, useEffect } from 'react'; function RecipeApp() { const [recipes, setRecipes] = useState([]); useEffect(() => { const fetchRecipes = async () => { try { const response = await fetch('你的Yummly API请求URL'); const data = await response.json(); // 这里假设数组键是recipes,根据你实际打印的结果调整 setRecipes(data.recipes); } catch (err) { console.error('获取食谱出错啦:', err); } }; fetchRecipes(); }, []); // 接下来写渲染逻辑 }
3. 遍历数组,渲染具体字段
现在你有了recipes数组,就可以用map方法遍历它,每个食谱对象只渲染你需要的属性(比如菜名、食材、图片这些),绝对不能直接渲染整个recipe对象:
return ( <div className="recipe-container"> <h1>我的食谱列表</h1> {/* 遍历食谱数组 */} {recipes.map(recipe => ( {/* 必须给每个列表项加唯一key,用recipe.id最靠谱 */} <div key={recipe.id} className="recipe-card"> <h2>{recipe.recipeName}</h2> <p>来源: {recipe.sourceDisplayName}</p> <p>评分: {recipe.rating}/5</p> <h3>食材:</h3> <ul> {/* 遍历食材数组 */} {recipe.ingredients.map((ingredient, idx) => ( <li key={idx}>{ingredient}</li> ))} </ul> {/* 渲染图片,注意imageUrlsBySize是对象,取你需要的尺寸 */} {recipe.imageUrlsBySize['90'] && ( <img src={recipe.imageUrlsBySize['90']} alt={`${recipe.recipeName}的缩略图`} /> )} </div> ))} </div> );
关键注意点
- 别直接渲染对象:要是你写
{recipe}肯定会触发那个错误,必须渲染像recipe.recipeName这种具体的属性值 - key不能少:
map遍历的时候必须给每个元素加唯一的key,这里用recipe.id是最优解,因为每个食谱的ID都是唯一的 - 处理可选字段:比如有的食谱可能没有图片,用
&&判断一下再渲染,避免触发报错
这样调整之后,你应该就能正常渲染出食谱列表啦!
内容的提问来源于stack exchange,提问作者Josue Guzman
相关产品推荐
相关产品推荐

