【问题标题】:TypeError: Cannot read property 'map' of undefined. ReactTypeError:无法读取未定义的属性“地图”。反应
【发布时间】:2021-04-29 14:12:44
【问题描述】:

我是 React 新手,但遇到了问题。 如何遍历数组中的数组? 尝试使用 map() 方法迭代数组时,出现错误

我的代码:

import React, {useState, useEffect} from 'react';

import Header from '../modules/header/header';
import Footer from '../modules/footer/footer';

import './pages.scss';

function PageWorksItem({ match, location }) {

    const { params: { id } } = match;
    const [error, setError] = useState(null);
    const [isLoaded, setIsLoaded] = useState(false);
    const [works, setItems] = useState([]);

    useEffect(() => {
        let cleanupFunction = false;
        fetch(`http://localhost:3001/works/${id}`)
            .then(res => res.json())
            .then(
                (result) => {
                    console.log(result);
                    setIsLoaded(true);
                    if(!cleanupFunction) setItems(result);
                },
                (error) => {
                    setIsLoaded(true);
                    setError(error);
                }
            )
            return () => cleanupFunction = true;
        }, [])

        if (error) {
            return <div className="works error">Error: {error.message}</div>;
        } else if (!isLoaded) {
            return <div className="works loading">. . .</div>;
        } else {
            return (
                <>
                    <Header />
                    <div className="works item">
                        {works.tags.map(item => (
                            <li>{item}</li>
                        ))}
                    </div>
                    <Footer />
                </>
            );
        }
    }

export default PageWorksItem;

JSON 片段:

{
    "works": [
        { 
            "id": 1, 
            "name": "21 one line SPA images",
            "cat": "Illustrations",
            "tags": ["one", "two", "free"]
        }
    ]
}

如果您指定 {works.tags} 或使用索引 {works.tags[0]} - 一切正常,但如果您遍历数组,则会发生错误。

【问题讨论】:

  • 你能显示console.log(result);的结果吗?
  • PageWorksItem 应该返回一些东西!
  • @Viet { "id": 1, "name": "21 one line SPA images", "cat": "Illustrations", "tags": [ "one", "two", "free" ] }
  • 您的works 状态是对象,它应该是数组才能使用地图功能。
  • 如果你做 spreadOperator: setItems({...result})?

标签: javascript json reactjs


【解决方案1】:

您正在使用works.tag.map。但是works的初始化值是一个空数组[]: const [works, setItems] = useState([]);。所以works.tagundefined 并且发生了这个错误。 您可以通过添加optional chaining 来解决此问题,如下所示:

{works.tags?.map((item, index)=> (
   <li key={index}>{item}</li>
))}

注意:使用map时需要在子组件中添加唯一的key

【讨论】:

  • 没错。 OP 应将 works 重命名为 work,因为端点只返回单个作品而不是作品列表。此外,它不应该被初始化为一个数组,而应该是 null 或一个默认的工作对象。
猜你喜欢
  • 2021-12-02
  • 2020-09-23
  • 1970-01-01
  • 2021-08-28
  • 2021-02-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多