React setState 是同步的还是异步的?

小夏 科技 更新 2024-01-28

在 React 中,setstate方法有时是异步的,有时是同步的,具体取决于它们的使用方式和环境。

当我们调用时做出反应setstate方法,React 将新状态合并到组件的状态队列中,并在未来的某个时间点更新组件的状态。 此更新过程是异步的,即不能保证它会存在setstate状态在调用后立即更新,而是将状态更新推迟到下一个渲染周期。 在本例中,setstate该方法返回一个promise对象,但该对象不包含任何有用的信息。

但是,当setstate当直接调用方法时,更新过程是同步的,而不是在事件处理程序、异步或生命周期函数中调用的。 在这种情况下,React 会立即更新组件的状态,并在更新后立即执行重新渲染。 在本例中,setstate该方法不返回任何信息。

需要注意的是,React 中异步更新状态的机制可以提高性能并优化页面渲染速度,因为它允许 React 在正确的时间批量更新组件状态,从而避免过度渲染和浏览器性能问题。 如果我们需要在更新状态后立即执行某些操作,则可以使用它setstate方法的函数或生命周期函数componentdidupdate来实现它。 例如:

jscopy codeclass mycomponent extends react.component ; handleclick() => )render() 

this.handleclick()}increment

这里setstate该方法接受 ** 函数作为第二个参数,在状态更新完成后调用该函数,并将更新后的状态作为参数传递。 在此功能中,您可以执行状态更新后需要立即执行的任何操作,例如输出调试信息、发送网络请求等。

2023.04.19 更新。

如果在 setstate 之后无法直接获取 state 的值。 SetState 是异步的,React 的内部机制可以检测到它;在 React 无法检测到的地方,例如原生事件addeventlistenersetintervalsettimeout,setstate 是同步的 setstate 的更新不是简单的异步或同步,这实际上与调用时的环境有关。

在 Composition Event 和 Lifecycle 挂钩(ComponentDidUpdate 除外)中,SetState 为"异步"之;在原生事件和 settimeout 中,setstate 是同步的,可以立即获取更新的值批量更新

不是逐个同步执行 setstate,而是将它们一个接一个地排队,然后最终一起执行。 在 Synthetic Events 和 Lifecycle Hooks 中,当 setstate 更新队列时,它会存储合并状态 (object.)。assign)。因此,之前设置的键值将在以后被覆盖,并且更新将只执行一次。

异步现象的原因

setstate 的“异步”并不意味着它是在内部通过异步实现的其实执行过程本身是与**同步的,但是合成事件和生命钩子函数的调用顺序是在更新之前,导致合成事件和钩子函数中无法立即获取到更新后的值,形成了所谓的“异步”。当然,你可以通过在第二个参数 setstate(partialstate, callback) 中使用回调来获取更新后的结果。

setState 并不是真正的异步,它只是看起来是异步的。 在源代码中,使用 isbatchingupdates 来确定这一点

SetState 调用流程:

调用此名称setState(newstate)将新状态 newstate 存储在待处理队列中,判断是否在 Batch Update(isBatchingUpdates is true)isBatchingUpdates=true,将组件保存在 dirtycomponents 中,经过异步更新过程,合并操作,延迟更新;isBatchingUpdates=false。 遍历所有 dirtyComponents,调用 UpdateComponent,更新待处理状态或 props

为什么要修改它状态无效

SetState 实质上是通过排队机制实现状态更新。 当 setstate 被执行时,需要更新的状态会被合并并放入状态队列中,而不是立即更新状态,队列机制可以批量更新状态。

如果您不直接通过 setstate 修改它state,那么这个状态就不会放到状态队列中了,下次我们调用 setState 合并状态队列时,会忽略之前直接修改过的状态,这样我们就无法合并,实际上并没有更新你想要的状态。

参考文档:

相似文章

    旭日东升是阳刚之气,只能与苦难分享福气,这是没有文化的损失

    在时间的流逝中,有些故事如春花似锦,让人在平凡中发现不平凡。今天,我们要讲的故事,是一首歌的旋律,却在时间的长河中编织着梦想 坚毅 成长的动人传奇。故事开始于一个小乡村,有一个名叫王旭的男孩。小时候,他懂得了生活的艰辛,但仍然保持着诚实稳重的性格。直到有一天,他完全被心中的一首歌点燃了。这首歌改变了...

    人老了,最大的悲哀就是和三类亲戚住在同一屋檐下

    陆辑曾在 短歌行 中写道 预期寿命,死亡就像早晨的霜冻。时间不重,华不再阳。人们说,这一生不长,但也不短,匆忙忙的几十年,在不知不觉中悄然流逝,再也走不来覆去。眨眼间,意气风发的年轻人渐渐变成了头上的白发,脸上布满了无数的皱纹。生 老 病 死是自然规律,不值得悲伤和哭泣,比衰老更可怕的是孤独,比孤独...

    郑玉玲交往十年的男友也是一样,64岁未婚不育,如今身家过亿

    娱乐圈闪耀的明星数不胜数,也有一群年纪较大的巨星,他们坚持着自己独特的生活方式 他们选择一辈子不结婚不生子。做出这个决定的原因有很多,无论是缺乏合适的伴侣,还是深深的情感创伤,还是单身的独立性。今天,我们将重点介绍一位最具魅力的香港明星,她就是令人惊艳的程玉玲。港星郑玉玲,长相惊艳,演技精湛,堪称 ...

    邓小平什么时候超越华国锋同志成为事实上的核心?

    这位经历过政治波折的伟人,他的一生充满了坎坷,他的一生可谓是跌宕起伏。他第一次经历波折是在年,当时博古夺取了军事和政治权力,实行 左 政策,导致红军遭遇挫折,邓对此不满。他提议在苏维埃代表大会上纠正自己的错误,但博古不同意,剥夺了他的军事和政治领导权,并指派他在基层工作。那段时间,邓心情低落,同志见...

    累积本金,频率相同

    今天从家里出来,中午没吃完炸水饺,又没有包装盒,直接把保鲜袋和碗一起打包 今晚上夜班,不用去食堂吃饭 辛浩不爱喝油茶,不然油茶就得装修了。冷冻酿豆腐和风肠 去年是嫂子做的,纯手工制作,今年应该也一样。以前卖肉的老板帮忙做好,肉和加工费算在一起 柿子糕 柿子都是红色的,会破皮,外观不好看,选择便宜卖或...