【问题标题】:todos.map is not a function - not able to edit a specific itemtodos.map 不是函数 - 无法编辑特定项目
【发布时间】:2021-04-20 03:32:01
【问题描述】:

我正在尝试使用带有编辑选项的待办事项应用程序。 目标是点击编辑按钮,这将打开一个输入字段,输入新的编辑文本,然后有两个选择,是否保存更改。

我已经设法为其编写代码以打开输入字段,并且能够单击按钮以不保存更改,但发生的情况是它打开了所有待办事项的输入字段,并且每当我尝试更新特定 todo 的值时,我都会收到错误“todos.map 不是函数”。

这是 TodoList.js

import Todo from "./Todo";
import AddTodo from "./AddTodo";
import { v4 as uuidv4 } from "uuid";

const TodoList = () => {
  //Handlers Add/Remove/RemoveAll/Edit
  const addTodoHandler = (input) => {
    setTodos([
      ...todos,
      {
        name: input,
        id: uuidv4(),
      },
    ]);
  };

  const changeEditMode = (id) => {
    setEditMode(!editMode);
    console.log(id);
  };

  const removeTodosHandler = () => {
    if (window.confirm("Are you sure you want to delete everything?")) {
      setTodos([]);
    }
  };

  const removeTodoHandler = (id) => {
    setTodos(todos.filter((todo) => todo.id !== id));
  };

  const updateValue = (id) => {
    inputRef.current.focus();
    setEditMode(!editMode);
    setTodos({ name: inputRef.current.value });
  };

  //Todo list states.
  const inputRef = useRef("");
  const [todos, setTodos] = useState([]);
  const [editMode, setEditMode] = useState(false);

  return (
    <div>
      <div>
        {todos.map((todo) => {
          return (
            <div>
              {editMode ? (
                <div>
                  {" "}
                  <input
                    type="text"
                    defaultValue={todo.name}
                    ref={inputRef}
                  ></input>
                  <button onClick={(e) => updateValue(todo.id)}>ok</button>
                  <button onClick={(e) => setEditMode(!editMode)}>x</button>
                </div>
              ) : (
                <div></div>
              )}
              <Todo name={todo.name} key={todo.id} />
              <button onClick={() => removeTodoHandler(todo.id)}>X</button>
              <button onClick={(e) => changeEditMode(todo.id)}>Edit</button>
            </div>
          );
        })}
      </div>
      <AddTodo
        handleAddTodo={addTodoHandler}
        removeTodosHandler={removeTodosHandler}
        revemoveTodoHandler={removeTodoHandler}
      />
    </div>
  );
};

export default TodoList;

这是 Todo.js


const Todo = ({ name }) => {
  return (
    <div>
      <div>{name}</div>
    </div>
  );
};

export default Todo;

任何帮助表示赞赏!

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您的updateValue 函数正在将您的待办事项设置为一个对象。所以它会给你这个错误,因为你不能对对象使用 map 方法。

    【讨论】:

      【解决方案2】:

      在您的 updateValue 方法中,您将 todoList 设置为对象。

        const updateValue = (id) => {
          inputRef.current.focus();
          setEditMode(!editMode);
          setTodos({ name: inputRef.current.value });
        };
      

      但是你要做的是首先找出带有 id 的项目,然后更新该对象的 name 属性,然后再次将新数组设置为 setTodos setter。

      像这样:

          const clonedTodos = todos;
          const todoIndex = clonedTodos.findIndex((todo) => todo.id === id);
          const updatedTodo = {
            ...clonedTodos[todoIndex],
            name: inputRef.current.value,
          };
          const updatedTodos = [...clonedTodos];
          updatedTodos[todoIndex] = updatedTodo;
          setTodos(updatedTodos);
      

      【讨论】:

        猜你喜欢
        • 2020-08-30
        • 1970-01-01
        • 2022-11-14
        • 2016-02-13
        • 2018-12-31
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多