无法使用React挂钩读取未定义的属性“地图”

时间:2019-04-13 15:24:31

标签: javascript reactjs axios

我试图使用fortnite api显示当前商品商店,并且标题出现错误,当我控制台日志结果时,它显示一个数组,但无法映射它?为什么?

import React, { useState, useEffect } from 'react'
import axios from 'axios';
export default function itemShop() {
    const [shop, setShop] = useState('')
    const API = 'https://fortnite-public-api.theapinetwork.com/prod09/store/get?language={en}'
    useEffect(() => {
        const fetchData = async () => {
            const result = await axios(
                API,
            );

            setShop(result.data);
        };
        fetchData();
    }, []);

    const { items } = shop;
    console.log(items)
    return (
        <div>
            <p>{shop.date}</p>
            {items.map(item => <p>{item.name}</p>)}
        </div>
    )
}

代码沙箱:https://codesandbox.io/embed/km10wq4y5

5 个答案:

答案 0 :(得分:3)

渲染之前,您需要检查项目是否不是null / undefined:

{items && items.map(item => (
        <p>{item.name}</p>
      ))}

工作:https://codesandbox.io/s/24vkqzn6xy

答案 1 :(得分:2)

问题在这一行:

const [shop, setShop] = useState('')

由于您期望shop.items为数组,因此将初始状态定义为:

const [shop, setShop] = useState({ items: [] });

还要为每个p分配唯一的密钥,在这里:

<p key={item.itemid}>{item.name}</p>

Working Code.

答案 2 :(得分:1)

您也可以这样

{ items?.map(item => (<p>{ item.name }</p>)) }

答案 3 :(得分:0)

对我来说,我忘记了在调用 async 方法后在 axios 中添加 await 。像下面的代码。如果上述方法对您没有帮助,请确保再次检查您的代码。

async function getCategories() {
      try {
        const response = axios.get("API");
        setCategories(response.data);
      } catch (error) {
        console.log("error", error);
      }
    }

答案 4 :(得分:0)

如果有人想了解这个问题及其解决方案,可以访问网站网站,这对我真的很有帮助 https://www.debuggr.io/react-map-of-undefined/