当前位置:首页 > 编程语言 > 正文内容

如何修复React报错 – TypeError: Cannot Read Property ‘Map’ of Undefined

a811625532年前 (2023-11-02)编程语言18

您是否在 应用程序中遇到了令人沮丧的 “TypeError: Cannot Read Property ‘Map’ of Undefined” 错误?这种错误的调试可能很棘手,不过不用担心,我们会帮你解决。

在本文中,我们将向您介绍常见的原因和解决方案,以帮助您修复此错误。无论您是经验丰富的 React ,还是刚刚起步,本指南都将帮助您的应用程序重回正轨。

什么原因导致 “TypeError: Cannot Read Property ‘Map’ of Undefined” 错误?

TypeError: Cannot Read Property ‘Map’ of Undefined 错误通常发生在您尝试访问 React 代码中未定义值的属性或 *** 时。

通俗地说,当您尝试映射未定义的值时就会发生该错误,例如尚未初始化或尚未接收数据的数组。

在下面的示例中,您正在从 数据中获取待办事项,但在来自 请求的数据到达之前,map *** 就已被调用。

import { usestate, useEffect } from 'react';
function app() {
const [todos, setTodos] = useState();
useEffect(() => {
const getTodos = async () => {
const response = awAIt fetch(
'https://jsonplaceholder.typicode.com/todos?_limit=5'
);
const data = await response.json();
setTodos(data);
};
getTodos();
}, []);
conSOLe.log(todos);
return (
<div>
{todos.map((todo) => (
<div key={todo.id}>
<h2>Item: {todo.title}</h2>
</div>
))}
</div>
);
}
export default App;

上面的代码会产生 “TypeError: Cannot read properties of undefined (reading ‘map’)” 错误:

TypeError: Cannot read properties of undefined (reading ‘map’) 错误信息

您需要寻找一种 *** ,让 在数组填充之前就知道 todos 状态是一个数组,或者在 todos 状态变量从 API 请求中获取数据之前避免运行 map *** 。

修复 “TypeError:无法读取未定义的属性’Map'” 错误

以下是修复 React 中“TypeError: Cannot Read Property ‘Map’  of Undefined”错误:

  1. 将状态变量初始化为空数组
  2. 使用比较运算符
  3. 使用可选的链式运算符 (?.)

让我们逐一探讨这些解决方案,以及它们如何帮助您解决 React 代码中的错误。

1. 将状态变量初始化为空数组

解决 “TypeError: Cannot Read Property ‘Map’ of Undefined”(无法读取未定义的属性 “Map”)错误的直接解决方案之一是确保你试图映射的数组变量是已定义的。

你可以将状态变量初始化为默认的空数组,这将确保变量始终存在,并且在你尝试映射它时不会出错。

例如,下面是两个类似的组件,之一个组件的状态变量没有初始化为空数组,而第二个组件的状态变量初始化为空数组:

// Before initializing your state variable to an empty array
function MyComponent() {
const [myList, setMyList] = useState();
return (
<ul>
{myList.map(item => <li>{item}</li>)}
</ul>
);
}
// After initializing your state variable to an empty array
function MyComponent() {
const [myList, setMyList] = useState([]);
return (
<ul>
{myList.map(item => <li>{item}</li>)}
</ul>
);
}

在上面的示例中,默认情况下使用 useState([])myList 状态变量初始化为空数组。这确保了即使 myList 最初未定义,它也始终是一个数组,而不会引发 “TypeError: Cannot Read Property ‘Map’ of Undefined” 错误。

在获取示例中,也可以将 todos 状态变量初始化为空数组( [] ):

import { useState, useEffect } from 'react';
function App() {
// Initialize the state to an empty array of todos.
const [todos, setTodos] = useState([]);
useEffect(() => {
const getTodos = async () => {
const response = await fetch(
'https://jsonplaceholder.typicode.com/todos?_limit=5'
);
const data = await response.json();
setTodos(data);
};
getTodos();
}, []);
console.log(todos);
return (
<div>
{todos.map((todo) => (
<div key={todo.id}>
<h2>Item: {todo.title}</h2>
</div>
))}
</div>
);
}
export default App;

2. 使用比较运算符

另一种解决方案是在映射数组变量之前,使用比较运算符检查数组变量是否已定义。您可以使用三元或逻辑 AND (&&) 运算符来实现这一目的。

下面是使用三元运算符的示例:

function MyComponent() {
const [myList, setMyList] = useState();
return (
<ul>
{myList ? myList.map(item => <li>{item}</li>) : null}
</ul>
);
}

在此示例中,在尝试映射 myList 之前,要检查是否定义了 myList 数组变量。如果 myList 未定义,三元运算符将返回 null,并且不会呈现任何内容。如果 myList 已定义,则调用 map 函数,并渲染列表项。

这与使用逻辑 AND 运算符类似:

function MyComponent() {
const [myList, setMyList] = useState();
return (
<ul>
{myList && myList.map(item => <li>{item}</li>)}
</ul>
);
}

通过使用三元运算符等比较运算符,您可以处理加载问题,这样,当您从应用程序接口导入数据时,屏幕上就会显示其他内容:

import { useState, useEffect } from 'react';
function App() {
const [todos, setTodos] = useState();
useEffect(() => {
const getTodos = async () => {
const response = await fetch(
'https://jsonplaceholder.typicode.com/todos?_limit=5'
);
const data = await response.json();
setTodos(data);
};
getTodos();
}, []);
console.log(todos);
return (
<div>
{todos ? (
todos.map((todo) => (
<div key={todo.id}>
<h2>Item: {todo.title}</h2>
</div>
))
) : (
<h1>Loading...</h1>
)}
</div>
);
}
export default App;

3. 使用可选的链式运算符 (?.)

您还可以使用 ES2020 中引入的可选链式运算符 (?.) 。该运算符允许您安全地访问属性或 *** ,例如数组的 map *** ,而不会在数组未定义时产生错误。

下面是一个使用链式运算符检查 myList 状态变量的功能组件示例:

function MyComponent() {
const [myList, setMyList] = useState();
return (
<div>
{myList?.map((item) => (
<p>{item}</p>
))}
</div>
);
}

在上面的示例中,我们使用了可选的链式运算符来安全地访问 myList 数组变量。如果 myList 未定义,则不会呈现任何内容。如果 myList 已定义,则将调用 map *** ,并渲染列表项。

小结

在 React 中对未定义或空值使用 map *** 时,可能会出现 “TypeError: Cannot Read Property ‘Map’ of Undefined” 错误。

为修复此错误,我们讨论了三种解决方案。不过,使用比较运算符是最通用的解决方案,因为它可以处理 API 可能发送空响应或空值的情况。

此外,在不确定接收到的数据是否为数组时,可以添加一些 *** ,在调用 map *** 之前检查并转换数据类型。

现在轮到你了: 您遇到过这个问题吗?你是如何解决的?您还使用了本文未涉及的其他 *** 吗?请在评论中告诉我们!

扫描二维码推送至手机访问。

版权声明:本文由2345好导航站长资讯发布,如需转载请注明出处。

本文链接:http://www.2345hao.cn/blog/index.php/post/8080.html

分享给朋友:

“如何修复React报错 – TypeError: Cannot Read Property ‘Map’ of Undefined” 的相关文章

PHP 8.1有哪些变化:新特性、改变及弃用等

PHP 8.1有哪些变化:新特性、改变及弃用等

不久前,PHP 8.0大张旗鼓地发布了。它带来了许多新特性、性能增强和变化——其中最令人兴奋的是新的JIT编译器。 技术世界总是在向前发展,PHP也是如此。 ,包含了几个令人兴奋的特性。它定于今年晚些时候于2021年11月25日发布。 在本文中,我们将详细介绍PHP 8.1将带来哪些新的东...

宝塔面板教程之不同环境安装篇

宝塔面板教程之不同环境安装篇

Linux面板环境安装,主要支持LNMP和LAMP、Tomcat、node.js。不过对于大部分站长来说,主要是LNMP和LAMP两个环境的安装。 LNMP和LAMP两个环境的最大区别是,前者采用Nginx作为Web服务器,后者则采用Apache作为Web服务器。(选择哪个作为您的Web服务器,可...

27个学习PHP的最佳教程(免费和付费资源)

27个学习PHP的最佳教程(免费和付费资源)

对于初学者和那些刚刚进入WordPress开发的人来说,PHP是您可以开始的最佳起点之一。这是一种超级简单直接的语言,使其成为之一,因此相当容易上手,它构成了在线开发的支柱。另外,如果你想在WordPress后端工作,你肯定需要学习它。 但是,如果您不想在昂贵的大学课程上花费数月或数年时间怎么...

如何成为一名出色的Java开发人员

如何成为一名出色的Java开发人员

美国劳工统计局估计在美有超过软件开发人员。根据2021年的数据,其中,这是世界上使用最广泛的五种编程语言之一。 自然,学习Java并成为Java开发人员对于任何对软件开发感兴趣的人来说都是明智的职业选择。 在本综合指南中,您将学习成为Java开发人员所需的一切知识。我们将分解您需要的技能、工...

正面对比Node.js与PHP

正面对比Node.js与PHP

Node.js和PHP是Web开发工作中常用的两种基本Web技术。两者都为服务器端开发做出了贡献,Node.js甚至同时服务于客户端和服务器端开发。 PHP已经为开发人员服务了近3年,现在它为78%的网络提供支持。相比之下,Node.js相对较新,但扩展速度非常快,由于其全栈开发能力而成为流行...

Ruby on Rails与Node.js正面对比

Ruby on Rails与Node.js正面对比

为您的项目选择框架或语言可能具有挑战性,尤其是在后端,其中维护用户数据和创建API和库是关键。在撰写本文时,最流行的Web开发技术是Node.js和Ruby on Rails。 选择其中一个可能是一项艰巨的任务。这两种技术各有利弊,了解它们将帮助您为您的项目选择最佳选择。我们将在本文中为您提供...