javascript - setState的顺序

标签 javascript reactjs virtual-dom

例如,组件的初始状态为{loading: true, setup: true},当更改状态时,如下所示:


this.setState({
  loading: false,
  setup: false
})

是否有可能在某一时刻 loadingfalsesetup 仍为 true 因为据我所知(如果我错了请纠正我),通过VDOM更新的过程如下:

  • 将所有更改添加到差异队列
  • 以 60FPS 的速度(通过 requestAnimationFrame),批量处理 diff 队列 中的所有更改。然后按顺序将所有突变应用到 DOM。

由于我们按顺序将所有补丁应用到 DOM,所以我假设会有一个时间 loading: falsesetup: true

最佳答案

由于对象属性的顺序无法保证,因此 setState 的顺序也无法保证。此外,setStates 中的所有状态都会在对象中存在时更新一次。因此,在您的示例中,loadingsetup 状态都会立即更新。但我们不能说它的顺序是loading先,setup最后。我们不能说一种状态为true而另一种状态为false。两种状态都会立即更新为 false,但不保证其顺序(对象中属性的顺序)。


Will the browser do the paint and layout twice (as we change two states)?

浏览器将在状态更新后重新绘制,即。在浏览器重新绘制之前,这两种状态都已经受到影响。渲染钩子(Hook)将被调用两次,一次用于初始状态,一次用于更新状态。


如果你想保持一个状态为true而另一个状态为false,那么你可以使用如下回调:

this.setState({
  loading: false
}, () => {
  setTimeout(() => {
    this.setState({
      setup: false
    })
}, 5000) // setup to false after 5 seconds

关于javascript - setState的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52755615/

相关文章:

php - 当我使用 jquery 从不同的 php 页面编写选择框的选项时,它失败了!

javascript - 如何在指令中重新加载 css 背景图像

javascript - react 高阶组件 : Proper way to add instance methods

javascript - 如何使用 useEffect 钩子(Hook)注册事件?

angular - 路由器导出之外的组件,在通过防护进行路由器重定向后没有更新其 window.location.href 吗?

javascript - 无法在codeIgniter PHP中接收ajax请求

javascript - 向导表单验证

javascript - 对象扩展运算符语法无法与 JavaScript 中的计算属性一起正常工作

javascript - 渲染单选按钮

javascript - React 的 Virtual DOM 比 DOM 快多少?