【问题标题】:React TypeError: lists.map is not a functionReact TypeError:lists.map 不是函数
【发布时间】:2023-03-27 21:28:01
【问题描述】:

TypeError:lists.map 不是函数

1.我正在使用 React 制作 TodoList。在您添加列表之前,它一直有效, 按钮时添加删除功能时出错 点击了

2.使用useContext将列表与其他文件分开会不会有问题?

对于这个问题的尴尬,我深表歉意。 感谢您帮助解决此问题。

  • TodoList.jsx

    import React, { useContext} from 'react';
    import Todo from './Todo';
    import { ListContext } from './ListContext';



    const TodoList = () => {
        const [lists, setLists] = useContext(ListContext);

        return (
            <div>
                {lists.map((list, index) => {
                    return <Todo list={list.todos} key={index}/>
                })}
            </div>
        );
    }

    export default TodoList;

  • Btn.jsx

import React, {useContext} from 'react';
import { ListContext } from './ListContext';

const Btn = (id) => {

    const [lists, setLists] = useContext(ListContext);

    const onRemove = (id) => {
        setLists({
            lists: lists.filter(list => list.id !== id)
        });
    }

    return(
        <>
        <button onClick={(e) => {
            e.stopPropagation();
            onRemove(id);
        }}>x</button>
        </>
    );  `enter code here`
}

export default Btn;
  • ListContext.jsx
import React, {useState, createContext,} from 'react';

export const ListContext = createContext();

export const ListProvider = (props) => {

    const [lists, setLists] = useState([
        {
            todos: 'Make a TodoList',
            id: 1,
        },
    ]);

    return(
        <ListContext.Provider value={[lists, setLists]}>
            {props.children}
        </ListContext.Provider>
    );   
}

TypeError:lists.map 不是函数 待办事项列表 C:/Users/user/Desktop/Work/VSC-workspace/React/todolist/src/component/TodoList.jsx:11 8 | const [lists, setLists] = useContext(ListContext); 9 | 10 |返回(

11 | `在此输入代码 | ^ 12 | {lists.map((list, index) => { 13 |返回 14 | })}

【问题讨论】:

  • onRemove 中应该是setLists(lists.filter(list =&gt; list.id !== id))
  • 所以我对 React 有点陌生,但是当您使用 useState 创建列表时,您会说列表应该是带有 todosid 的对象数组。因此,当您使用setLists 并使用{ lists: lists.filter }.... 传入对象时,我相信您为键提供列表的对象应该是期望todosid 的对象,因此您无法设置该属性像这样的列表。您可能可以setLists(lists.filter(list =&gt; list.id !== id)),但也不确定lists 的数据来源
  • 为您的问题创建一个codesandbox.io/s/l4w3o6my59 示例。
  • 你是如何添加Btn组件的,也贴一下。

标签: javascript reactjs jsx


【解决方案1】:

你的问题就在这里,你只从lists传递todos而不是id

<Todo list={list.todos} key={index}/>

Todo 组件中,您尝试访问list.id,即undefined,因为您还没有从TodoList 组件传递它。

TodoList组件中,不需要传递list.todos,只需要传递list就好,

<Todo list={list} key={index}/>

您的Todo 组件应该是,

const Todo = ({list}) => { 
   return( 
      <div className="todolist"> 
        <li>
         {list.todos}
         <Btn id={list.id}/>
        </li> 
      </div> 
   ); 
}

另外一个问题是在Btn 组件定义中,

const Btn = (id) => { ... 

你需要这样做,

const Btn = ({id}) => { ... //notice the curly braces as you did in `Todo` component

注意:您仍然在这里遇到任何问题

lists.filter(list => list.id !== id)

你可以这样做,

lists.filter(list => Number(list.id) !== Number(id)) //possibility that `id` props might come as `string` type

【讨论】:

  • 感谢您的热心回复,问题已解决。我会学到很多东西。 :) @ravibagul91
猜你喜欢
  • 2016-09-02
  • 2018-12-23
  • 2020-09-11
  • 2021-07-20
  • 2016-11-21
  • 2020-12-04
  • 2021-07-11
  • 2015-09-01
  • 2015-08-22
相关资源
最近更新 更多