当前位置: 首页 > 知识库问答 >
问题:

useState setter未立即更新数组

卞俊哲
2023-03-14

我正在尝试在react中开发todo应用程序。下面是代码。
当我在文本框中输入todo并单击添加时,todo将给出旧值。
例如,如果我输入“a”,则todo数组将给出[],然后当我输入“b”时,todo显示[“a”]。请帮忙。

import React, { useState, useEffect } from "react";

function Todo() {
  const [value, setValue] = useState("");
  const [todos, setTodos] = useState([]);
  function changeHandler(e) {
    // console.log(e.target.value)
    setValue(e.target.value);
  }

  // this doesn't update todos and moreover logs infinitely
  // useEffect(() => {
  //   setTodos([...todos]);
  // }, [todos]);

  function handleClick() {
    setTodos([...todos, value]);
    console.log(todos);
    setValue("");
  }

  return (
    <div>
      <input
        type="text"
        value={value}
        onChange={changeHandler}
        placeholder="Add Todo"
      />
      <button onClick={handleClick}>Add Todo</button>
    </div>
  );
}
export default Todo;

编辑:

下面的工作

useEffect(() => {
    console.log(todos);
  }, [todoList]);

  function handleClick() {
    setTodos([...todos, value]);
    setValue("");
  }
    // console.log(todos);

  return (
    ...
}
export default Todo;

共有2个答案

孟子墨
2023-03-14

设置状态是异步的。当使用setTodos或setValue时,它会导致流中的重新渲染。

将控制台移动到Todo作用域函数。这样地:

...
function handleClick() {
  setTodos([...todos, value]);
  setValue("");
}

console.log(todos);

return (
...

下面的代码会导致一个循环,因为您的useEffect正在侦听todos中的所有更改,并且您的setTodos时间更长。

  // useEffect(() => {
  //   setTodos([...todos]);
  // }, [todos]);
华季同
2023-03-14

在React中设置状态是一个异步操作,如果要记录状态的状态,应使用useffect

js prettyprint-override">// Don't setTodos in an useEffect for todos since it will result in an infinite loop.
useEffect(() => {
  console.log(todos)
}, [todos]);
 类似资料:
  • 我有一个简单的组件 问题是我需要添加什么

  • 下面是我的代码的一个片段。调用filteredData()时,状态未更新。在状态更新之前,我必须单击按钮两次。这是一个旧项目,我正在使用钩子更新它。我以前在设置状态后使用了回调函数,但我不能用钩子实现。 }

  • 问题内容: 我正在做一个待办事项应用程序。这是违规代码的非常简化的版本。我有一个复选框: 这是调用复选框的函数: updateItem是映射为分派到redux的函数 我的问题是,当我调用updateItem操作并在console.log状态时,它总是落后1步。如果未选中该复选框且该复选框不为true,则仍将状态为true传递给updateItem函数。我是否需要调用另一个函数来强制状态更新? 问题

  • 我想问一下,为什么在执行事件时,我的状态没有改变。我已经搜索到需要在构造函数中绑定函数,但是状态仍然没有更新。 下面是我的代码:

  • 问题内容: 我想问为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 这个回调真的很混乱。只需使用async await代替:

  • 我正在使用Java FX textarea,并用它来为正在进行的步骤提供信息。 步骤如下。复制文件。删除旧文件。复制新文件。然后将一些属性从旧文件复制到新文件。 当点击一个按钮时,整个步骤开始。 我面临的问题是,当我使用append命令时,文本区域没有被更新。 append 命令添加数据,当函数终止时,我将所有文本放在一起。我希望在调用函数时更新文本区域。 在我的程序中,复制文件操作需要一些时间,