为什么React的useState Set函数不能立即反映变化?

58 阅读1分钟

在React中经常出现的一个问题是,为什么状态设置函数所做的改变似乎没有立即反映在我们的组件中。

例子。一个简单的计数器

如果我们使用一个useState 钩子的例子,它正在增加一个计数器,我们可以看到这种行为。

import { useState } from 'react';

function MyCounter() {
  const [count, setCount] = useState(0);

  function increment() {
    setCount(count + 1);
    console.log(count);
  }

  return (
    <div>
      Count: {count}
      <br />
      <button onClick={increment}>Increment</button>
    </div>
  );
}

加载这个简单的应用程序,我们可以看到我们的console.log ,似乎落后于实际的计数!但这实际上正是它应该做的。

但这实际上正是它应该工作的方式。让我们来探讨一下原因。

状态设置器是异步的

重要的是要记住,状态设置器是异步的。在我们的例子中,当我们调用setCountincrement 函数代码不会等待count 的更新。count 正在异步更新,但它不会被反映出来,直到下一个组件渲染

事实上,这是一件好事。我们不希望 count 变量在increment 函数中被更新,因为这将破坏JavaScript中闭包的概念,而闭包是语言中一个非常重要和有用的概念。我们的increment 函数对count 变量进行了闭包,我们可以保证在执行increment 函数的过程中,count 将始终是同一个值。

结论

重要的是要记住,设置状态是异步的,有状态变量的新值将在下一次渲染时提供给你,而不是立即在同一个函数中。