list.map 不是函数 help create-react-app

list.map is not a function help create-react-app

嗨,有人能告诉我为什么我收到 list.map is not a function 错误吗?我很确定我的 React 代码使列表成为一个数组,但我是初学者所以我可能忽略了一些东西

import React, { useState, useEffect } from "react";
import Task from "./Task";

function Home() {  
  const [text, setText] = useState("");
  const [task, setTask] = useState("");
  const [list, setList] = useState([]);

  useEffect(() => {
    setList(list.push(task));
  }, [task]);

  const addTask = (e) => {
    e.preventDefault();
    setTask(text);
    setText("");
  };

  const updateText = (e) => {
    setText(e.target.value);
  };

  return (
    <div className="Home">
      <h3>Home Page</h3>
      <form onSubmit={addTask}>
        <input type="text" value={text} onChange={updateText} />
        <button type="submit">Add</button>
      </form>
      <div className="listoftasks">
        {list.map((t) => (
          <Task
            text={t}            
          />
        ))}
      </div>
    </div>
  );
}

export default Home;

Array.push() 不 return 更新数组。因此你应该使用 Array.concat() -

useEffect(() => {
    setList(list.concat(task));
  }, [task]);

task 更新时,您将 list 的新值设置为 push 的结果,这是数组的新长度。

你应该推送然后更新状态

  useEffect(() => {
    list.push(task);
    setList(list.slice());
  }, [task]);

或使用扩展运算符,用于不变性函数方法:

  useEffect(() => {
      setList([...list, task]);
  }, [task]);

Array.push() returns一个数字,现在修改的数组的新长度。

useEffect(() => setList(list.push(newThing))) // list is now a number!!!

您已将列表转换为数字,所以现在对于 3 项数组(曾经是 2 项),您将调用 3.map()3 没有地图方法就可以了。

更糟糕的是,如果您只是按下并重置引用,您将不会更新

useEffect(() => {
  list.push(newThing)
  setList(list) // won't update! list === list is true, and thus does not trigger render
})

您可以通过创建新数组并通过串联传递它来通过几种方式更新列表

useEffect(() => setList(list.concat(newThing)) // works

或传播

useEffect(() => setList([...list, newThing])) // works

完成此操作后,将无法检查传递的实体是否具有相同的值。这应该允许触发渲染并显示您的新更新。