javascript - 使用 useState() Hook 从数组更新对象的单个属性

标签 javascript reactjs react-hooks

我在待办事项状态 Hook 中有一组对象。如果完成,我想更改单个属性。似乎我可以更新它但不使用 setTodos。我是 React 初学者。

  const [todos, setTodos] = useState([]);
  const [input, setInput] = useState("");

  const addTodoHandler = (e) => {
    e.preventDefault();
    if (input.length < 2) return;
    setTodos([...todos, { id: Date.now(), text: input, isComplete: false }]);
    setInput("");
  };

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

 const completeHandler = (id) => {

    // working without setTodo()
    // errors when added setTodo()
     todos.map((todo) =>
       todo.id === id ? console.log((todo.isComplete = !todo.isComplete)) : ""
     );

  };

      <div className="todolist">
        {todos.map((todo) => (
          <Todo
            key={todo.id}
            id={todo.id}
            text={todo.text}
            removeHandler={removeHandler}
            completeHandler={completeHandler}
            isComplete={todo.isComplete}
          />
        ))}
      </div>

最佳答案

completeHandler() 中解决这个问题首先使用 map() 创建一个新数组方法和内部map()方法更新 isComplete当前 todo并简单地返回更新后的值,如:

var updatedTodos = todos.map((todo) => todo.id === id ? {
  ...todo,
  isComplete: !todo.isComplete
} : todo);

然后里面setTodos()只需返回这个新的 updatedTodos数组如:

setTodos(updatedTodos);

您也可以在一行中执行此操作,例如:

setTodos(todos.map((todo) => todo.id === id ? { ...todo, isComplete: !todo.isComplete } : todo));

但前面的代码提供了更多的可读性,如果您想逐行检查每个变量,还有助于更好地调试。

关于javascript - 使用 useState() Hook 从数组更新对象的单个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61692695/

相关文章:

javascript - jquery beforeunload 关闭(不离开)页面时?

c# - 使用 JavaScript onclick 删除元素并在 SQL 中保存变量

javascript - 初学者 React 查询(如何删除一个元素并追加另一个元素)

sockets - 使用 useEffect 时复制 socket.io 监听器

reactjs - 为什么 destroyOnClose={true} 在 React 中不起作用

javascript - AngularJs 路由不再工作。地址栏更改但 View 没有

reactjs - 具有 LInk 的组件的 React 单元测试用例

javascript - 如何在 typescript 中使用抽象类

reactjs - 一般来说,在单个组件中使用一个或多个 useEffect 钩子(Hook)更好吗?

javascript - <li> 具有 onclick(开关/复选框)功能