开发者问题收集

浏览器抛出 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