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

USState不立即更新

扈昀
2023-03-14

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

function change(event) {
  let name = event.target.name;
  let value =
  event.target.type === "checkbox"
    ? event.target.checked
    : event.target.value;

setState((prevState) => ({ ...prevState, [name]: value }));
filteredData()

}

共有2个答案

孟英光
2023-03-14

这是因为setState是一个异步函数,如果您需要在设置状态后立即执行任何任务,则应在回调中执行。

类内组件

function change(event) {
  let name = event.target.name;
  let value =
  event.target.type === "checkbox"
    ? event.target.checked
    : event.target.value;

 this.setState(
    (prevState) => {
      return {
        ...prevState,
        [name]: value
      };
    },
    () => {
      filteredData();
    }
  );
}

在钩子中,由于钩子中没有setter的回调,我们可以在状态更改时使用use效应

useEffect(() => filteredData(), [state])
杨骏
2023-03-14

这就是use效应钩子的作用,因为setState钩子不像setState在类组件中那样具有回调。

useEffect(() => filteredData(), [state])

每次状态更改时,useEffect中的函数都将运行。正如saksh73所说,setState是异步的,但是它不返回promise,因此您不能对其调用then,也不能调用waitit。您必须使用useEffect对状态更改做出反应,如图所示。

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

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

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

  • 问题内容: 我想问一下为什么在执行onclick事件时状态没有变化。我已经搜索了一段时间,我需要在构造函数中绑定onclick函数,但状态仍未更新。这是我的代码: 问题答案: 幸运的是, setState进行了回调。这是我们获取更新状态的地方。考虑这个例子。 因此,当回调触发时,this.state是更新后的状态。你可以在回调中获取突变/更新的数据。

  • 问题内容: 码: 当我在中输入内容时,以下内容将立即更改。是否可以配置它仅在输入所有字符并保留输入后才更新? 问题答案: 更新资料 正如许多人提到的那样,Angular现在使用指令对此提供了内置支持。在这里查看更多。 下面的旧答案: ng-model没有内置选项来更改该行为,但是您可以编写一个自定义指令来执行此操作。@Gloopy 写了这样的指令。你可以在这里看看小提琴。 该指令从和事件中注销,这

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