开发者问题收集

Reactjs:TypeError:无法读取未定义的属性“map”

2021-06-02
494

我一直在研究那个 React 项目,并且一直在使用 axios 从后端获取数据。我多次收到 (TypeError: 无法读取未定义的属性“map”)错误,我尝试了多种修复方法,但都无济于事。我添加了一个用于加载的钩子,以确保数据在渲染之前存在,但如果我在页面之间来回切换,我会收到相同的错误

这是我的代码:

function Developer(props) {
    const [data, setData] = useState();
    const [loading , setLoading] = useState(true)
    const [error, setError] = useState();

    var id = props.match.params.id
    var location = props.match.params.location


    useEffect(() => {
        axios(`http://localhost:5000/api/${location}/${id}`)
        .then((response) => {
        setData(response.data);
        })
        .catch((error) => {
        console.error("Error fetching data: ", error);
        setError(error);
        })
        .finally(() => {
        setLoading(false);
        });
        }, []);
        
    if (loading) return "Loading...";
    if (error) return "Error!";

    return (
        <div>
            <h1>{data.Developer}</h1>
            <ul>
                {
                data.Projects.map((project) => (<li key = {project._id}>
                <a href= {`/${location}/${id}/${project._id}`}>{project.Project}</a></li> ))
                }
            </ul>
        </div> 
        )}
3个回答

在对数据属性进行映射之前,您应该检查其性质。

{
 data && data.Projects.length !== 0 &&
   data.Projects.map((project) => (<li key = {project._id}>
    <a href= {`/${location}/${id}/${project._id}`}>{project.Project}</a></li> ))
}

我建议您使用 javascrip fetch

mouafus
2021-06-02

我本人遇到了很多次错误。

首先,检查您从API获得的数据是否是JavaScript对象的数组

这是一个简单解决方案。

637859940

,所以我在这里完成的是使用三元运算符,它将做的是检查是否迄今是否具有数据状态,如果有数据状态,则它将显示数据其他明智的选择将显示“加载...”

Axios需要一些时间来获取和设置数据,但是页面呈现在此之前,这就是为什么它显示的原因无法读取属性'映射'未定义的

Mohak Gupta
2021-06-02

返回的数据可能不包含您需要的内容。

尝试打印出返回的数据

        axios(`http://localhost:5000/api/${location}/${id}`)
        .then((response) => {
          console.log(response.data);
          setData(response.data);
        })

它可能是一个有效的响应,但不包含该变量 data.Projects 。如果您想处理该值的缺失,可以使用类似以下内容:

(data.Projects || []).map(...)

这样,如果 data.Projects 为假,它将被替换为一个空数组,并调用 [].map(...)

Danosaure
2021-06-02