浏览器抛出 TypeError:无法读取未定义的属性“map”
2020-04-30
215
我是 React 的新手,正在使用它制作一个待办事项应用程序。为了列出用户输入的待办事项,我尝试使用地图浏览所有待办事项,并添加了一项功能,以便能够删除任何待办事项。
这是我的
Todos.js
:
import React, {useContext} from 'react';
import {ListGroup, ListGroupItem} from 'reactstrap';
import {FaCheckDouble} from 'react-icons/fa';
import { TodoContext } from '../Context/TodoContext';
import { REMOVE_TODO } from '../Context/action.types';
const Todos = () => {
const {todos, dispatch} = useContext(TodoContext);
return(
<ListGroup className="mt-5 mb-2 items">
{todos.map(todo => (
<ListGroupItem key={todo.id}>
{todo.todoString}
<span
className="float-right"
onClick={() => {
dispatch({
type: REMOVE_TODO,
payload: todo.id
})
}}
><FaCheckDouble/></span>
</ListGroupItem>
))}
</ListGroup>
)
}
export default Todos;
这是我的
App.js
(将
todo
更新为
todos
)
import React, {useReducer} from 'react';
import Container from "reactstrap/lib/Container";
import "bootstrap/dist/css/bootstrap.min.css";
import './App.css';
import {TodoContext} from './Context/TodoContext';
import todoReducer from "./Context/reducer";
import TodoForm from './Component/TodoForm';
import Todos from './Component/Todos';
const App = () => {
const [todos, dispatch] = useReducer(todoReducer, [])
return(
<TodoContext.Provider value={{todos, dispatch}}>
<Container fluid>
<h1>
Todo App with Context API
</h1>
<Todos/>
<TodoForm/>
</Container>
</TodoContext.Provider>
)
}
export default App;
浏览器向我抛出了错误: TypeError:无法读取未定义的属性“map”
3个回答
请确保
todos
是一个数组,并且不是未定义的。
undefined.map()
显然没有意义。因此,请确保正确导入,然后您实际上可以执行
todos && todos.map()
之类的操作。
Arun Kumar
2020-04-30
这是 React 中一个非常常见的问题。Todos 值最初未定义,而您正在尝试渲染它。您可以使用 useEffect() 检查其值。
您应该执行以下操作:
const Todos = () => {
const {todos, dispatch} = useContext(TodoContext);
return(
<ListGroup className="mt-5 mb-2 items">
{todos ? (
{todos.map(todo => (
<ListGroupItem key={todo.id}>
{todo.todoString}
<span
className="float-right"
onClick={() => {
dispatch({
type: REMOVE_TODO,
payload: todo.id
})
}}>
<FaCheckDouble/>
</span>
</ListGroupItem>
))}
) : null}
</ListGroup>
)}
您基本上是在说:如果 todos 有某个值,则渲染 todos.map,如果没有,则不渲染任何内容。
希望这对您有所帮助。
David Mitjana
2020-04-30
检查 todos 值,如果为空则出错:map not defined.
Amit Maurya
2020-04-30