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

标签 javascript reactjs react-hooks react-state

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

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 函数也不会返回 promise。因此,我们不能将 then 处理程序附加到它或使用 async/await 来获取更新的状态值。如果我们有一些状态变量需要根据另一个状态变量进行更新,我们就不能同步依赖更新后的状态变量。

状态更新通常发生在下一次渲染时,但即便如此也可能有所不同。批量更新取决于 react ,我们无法改变这一点。

所以这样写:

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

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

关于javascript - 无法找到两种类型的数组状态更新之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68725780/

相关文章:

javascript - TypeError : $(. ..).sortable 不是 Angular 中的函数

javascript - html中的视频显示

reactjs - react 路由器 : Why is the useHistory undefined in react?

reactjs - 单击按钮时,不会添加数据

reactjs - React 应用程序由于 16.9 中的 useEffect hook 而卡住,而在 16.8 中工作正常

javascript - jQuery ('body' ).text() 在不同的浏览器中给出不同的答案

javascript - 如何使固定的中间按钮与具有 100% 高度的 div 相同的渐变合并

reactjs - 在 React-Native 中定义静态 PropTypes 时 '.isRequired' 的含义

javascript - React-Router 查询字符串比状态变量落后一步

javascript - ReactJs + Redux ---> 尝试调用企业名称,其中 item.business_id === BusinessId