无法找到两种类型的数组状态更新之间的区别

Cannot find the differece between two types of state updates with arrays

通常我会看到这种状态更新(这只是一个例子):

const NumArray = () => {
  const [numbers, setNumbers] = useState([])
  
  return (
    <div>
      <p>Numbers:[ {numbers} ]</p>
      /////////////////////
      <button onClick={() => setNumbers(prevState => [...prevState, 1])}>
      /////////////////////
        Click me
      </button>
    </div>
  )
}

但是如果我使用这个变体它仍然有效:

const NumArray = () => {
      const [numbers, setNumbers] = useState([])
      
      return (
        <div>
          <p>Numbers:[ {numbers} ]</p>
          /////////////////////
          <button onClick={() => setNumbers([...numbers, 1])}>
          /////////////////////
            Click me
          </button>
        </div>
      )
    }

我的问题是,这两种状态更新有什么区别? 为什么人们倾向于使用回调函数?

useState 是异步的。它不会立即更新状态,但具有用于更新状态对象的队列。这样做是为了提高 React 组件的渲染性能。

即使它是异步的,useState 函数也不会 return 承诺。因此我们不能将 then 处理程序附加到它或使用 async/await 来获取更新的状态值。而如果我们有一些状态变量需要根据另一个状态变量来更新,我们就不能同步依赖更新后的状态变量。

状态更新通常发生在下一次渲染时,但即便如此也可能有所不同。批量更新取决于反应,我们无能为力。

所以这样写:

<button onClick={() => setNumbers(prevState => [...prevState, 1])}>

保证 prevState 实际上是以前的状态。当在没有回调的情况下编写它时,我们不太关心它是否是准确的先前状态。