setState 的顺序

Order of setState

例如,一个组件的初始状态为 {loading: true, setup: true},当像这样改变状态时:


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

有没有可能在某一时刻 loadingfalsesetup 在真实 DOM 上仍然是 true ?因为据我所知(如有错误请指正),通过VDOM更新的过程如下:

由于我们按顺序将所有补丁应用到 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)?

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


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

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

is there a time where loading is false and setup is true ?

不,我很确定没有机会 setState 可以拆分成单独的更新 可以单独传递给 DOM。

这样不行。

首先: VDOM 将在一次 fn 调用中同时更新这两个更改。

其次: DOM不会随着"partially ready"的更新而更新。当某些(并行)进程未就绪时,差异化(自 Fiber 以来)可能会延迟 DOM 更新的片段。