javascript 循环/Map/迭代对象导致无法读取未定义的属性(阅读“Map”)错误,但数据存在

aiqt4smr  于 2023-05-12  发布在  Java
关注(0)|答案(2)|浏览(162)

我有一个从API端点获取数据的react组件。为了调试的目的,当我调用API时,我将API调用的结果记录到控制台,它看起来像这样:

我遇到的问题是,当我试图在我的组件中呈现BreadCrumbLinks属性时,我得到了这个错误:
TypeError:无法读取未定义的属性(阅读“map”)
关于BreadCrumbHeader
我得到了一个“Undefined”错误,但我知道数据是存在的,因为我可以读取和呈现所有其他字段(例如BreadCrumbBgImage)。
此外,如果我注解掉map/loop,那么在页面加载时,其余的数据将正确显示。然后,如果我取消注解并保存文件,map/loop的数据现在可以正确显示。
我只能假设代码试图在加载之前呈现循环的内容。
下面是该组件的代码:

import React, { useState, useEffect } from 'react';
import API from "../../API";
import { useLocation } from 'react-router-dom';
import { BreadCrumbTitleSection, SubtitleSection, Subtitle } from './breadCrumbHeaderStyle';
import { Breadcrumb } from 'react-bootstrap';

function BreadCrumbHeader() {
    const location = useLocation();

    const [breadCrumbData, setBreadCrumbData] = useState([]);

    const getBreadCrumbData = async () => {
        const breadCrumbHeaderResponse = await API.fetchBreadCrumbHeader(location.pathname);
        setBreadCrumbData(breadCrumbHeaderResponse);

        console.log("OUT-PUT-OF-API-CALL");
        console.log(breadCrumbHeaderResponse);
        console.log("END-OF-OUT");

    };

    useEffect(() => {
        getBreadCrumbData();
    }, [location.pathname]);

    return (
        <div>

            <BreadCrumbTitleSection backgroundUrl={breadCrumbData.BreadCrumbBgImage}>
                <div className="container">
                    <div className="row no-gutters">
                        <div className="col-xs-12 col-xl-prefix-1 col-xl-11">
                            <h1 className="h3 text-white">{breadCrumbData.BreadCrumbTitle}</h1>
                            <Breadcrumb>
                                {breadCrumbData.BreadCrumbLinks.map(breadCrumbLink => (
                                    <Breadcrumb.Item href={breadCrumbLink.LinkUrl} key={breadCrumbLink.Id} active={breadCrumbLink.IsActive}>
                                        {breadCrumbLink.LinkText}
                                        </Breadcrumb.Item>
                                ))}
                            </Breadcrumb>
                    </div>
                </div>
            </div>
            </BreadCrumbTitleSection>
            <SubtitleSection>
                <Subtitle> {breadCrumbData.SubTitle}</Subtitle>
            </SubtitleSection>
     </div>
    );
}
export default BreadCrumbHeader;

有谁能解释一下这里发生了什么以及如何解决i?

umuewwlo

umuewwlo1#

你试图在状态改变之前Map你的数组,useEffect在第一次渲染时被调用,你的数组在第一次渲染时没有状态,你可以使用类似加载钩子的东西,像这样

const [loading, setLoading] = useState(false)
    useEffect(() =>{
        setLoading(true)
        fetchData()
    },[])
    const fetchData = () =>{
        //my api call
        setLoading(false)
    }
    return (
        {loading ? (
            // my loading message or function
        ): (
            // my show component 
        )}
    )

这只是一个小例子

vpfxa7rd

vpfxa7rd2#

您试图在获取数据之前Map数据,因此它是一个空数组(breadCrumbData状态的初始值)。您应该使用可选链接:

{breadCrumbData?.BreadCrumbLinks?.map(breadCrumbLink =>

相关问题