【问题标题】:Trying to fetch data from API in React - TypeError: recipes.map is not a function尝试从 React 中的 API 获取数据 - TypeError:recipes.map 不是函数
【发布时间】:2021-08-07 09:50:44
【问题描述】:

我正在尝试从 API 获取数据并将其作为道具传递到我的组件中。问题是我收到这种类型的错误。一些谷歌搜索显示,API 似乎返回一个对象,而 map() 函数需要一个数组。好的,控制台记录了我从 API 获得的信息,它确实是一个对象。容易修复对吧?但是,我没有为这项工作找到任何修复程序。这是我原来的错误代码:

export async function getStaticProps(context) {
const res = await fetch("https://rezepte-api-test.babafresh.de/recipes.json")
const data = await res.json()

return {

    props: { recipes: data }, // will be passed to the page component as props
}

export default function Test(recipes) {
console.log(typeof recipes);
return (
    <div>
        <ul>
            {recipes.map((recipe) =>(
                <div key={recipe.name}>
                    <li>{recipe.name}</li>
                </div>
            ))}
        </ul>
    </div>
);

我确实尝试了我在此处找到的以下一些修复,但我的数组中的任何食谱都没有被渲染。我在一个白页前,我的地图功能在这里错了吗?

export default function Test(recipes) {

let arr = Object.entries(recipes);
return (
    <div>
        <ul>
            {arr.map((recipe) =>(
                <div key={recipe.name}>
                    <li>{recipe.name}</li>
                </div>
            ))}
        </ul>
    </div>
);

感谢任何指点。

【问题讨论】:

    标签: json reactjs fetch next.js


    【解决方案1】:

    从您的第一个 sn-p 开始,不确定顶级执行上下文中的此 return 语句是否正确或您打算做什么。

    return {
    
        props: { recipes: data }, // will be passed to the page component as props
    }
    

    调用receipes api返回一个数组而不是一个对象

    所以你对Object.entries 所做的事情是不正确的。很简单,在 JSX 中将数组 props 与 map 函数一起使用。

    为了最短的修复,

    let arr = receipes.receipes;

    附:如果您认为这组 API 数据仅适用于该组件并且不会被共享,请尝试使用 useEffect 挂钩来获取该组件本身内部的数据并进行渲染。

        export default function Test() {
        const [receipes, setReceipes] = useState('');
        
        useEffect(() => setReceipes(await fetch("https://rezepte-api-test.babafresh.de/recipes.json").then(res => res.json())), []);
        
        return (
            <div>
                <ul>
                    {receipes.map((recipe) =>(
                        <div key={recipe.name}>
                            <li>{recipe.name}</li>
                        </div>
                    ))}
                </ul>
            </div>
         );
      }
    

    【讨论】:

    • 我之前没有使用 useEffect 挂钩的经验,但我会尝试一下。至于使用带有 map 函数的数组道具,这不正是我在第一个代码 sn-p 中尝试做的吗? (在
        内)。谢谢你的帮助
    • 你应该使用 useEffect,这是 React 的方式。阅读我回答的第一部分:我不明白你为什么在空中返回一些东西,而且你得到一个对象作为响应而不是一个数组,这是不正确的。除此之外,我从 Object.entries 中看到您的日志,并且您正在搞砸从对象中获取值。使用receipes.receipes 而不是Object.entries
    • @AakashVerma 我认为最初receipes 需要是空白数组,否则它将尝试映射到空白字符串然后给出错误。
    • 我用 useEffect 钩子试过了,但仍然遇到 TypeError:receipes.map is not a function
    • @PriyankKachhela 这就是useState([]) 提供的。一个空数组开始。
    【解决方案2】:

    API 只返回一个对象数组。

    要从 API 访问数据,您只需将 map 覆盖为 array 即可

        <div>
            <ul>
                {res.data.map((recipe) =>(
                    <div key={recipe.name}>
                        <li>{recipe.name}</li>
                    </div>
                ))}
            </ul>
        </div>
    

    【讨论】:

    • 这正是我在第一个代码 sn-p 中所做的,我所缺少的只是 .data 是你在说什么?尝试你的 sn-p,我得到 TypeError: Cannot read property 'map' of undefined(我用我的名为'recipes'的道具替换了 res,我传递给了组件
    【解决方案3】:

    你在使用 useEffect 吗?通常这些问题与异步获取和最初获取未定义或空列表等有关,作为数据实际可用之前的道具。如果您正在使用 effect,那么只有在定义了 recipes 时才尝试通过调用 map 来捕获第一个错误。

    对于您的第二个解决方案:通过记录来检查 arr 的内容。

    【讨论】:

    • 我没有使用 useEffect。如果我记录我的数组的内容,我会得到以下输出: [ [ 'recipes', [ [Object], [Object], [Object], [Object], [Object], [Object], [Object], [对象], [对象], [对象], [对象], [对象], [对象], [对象], [对象], [对象], [对象], [对象], [对象], [对象] , [对象], [对象], [对象], [对象], [对象] ] ]
    猜你喜欢
    • 2019-09-20
    • 1970-01-01
    • 2020-05-09
    • 2021-05-24
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多