ITPub博客

首页 > IT职业 > IT职场 > 异步的setState?? No!

异步的setState?? No!

IT职场 作者:nopower 时间:2021-09-09 10:29:13 0 删除 编辑

React setState 是异步的?

名词解释

React: 懒得解释
setState: 懒得解释
异步: 懒得解释
ReactDom: 懒得解释
…

一、不是异步的 异步效果叫批量更新

  1. 不绕弯 不是异步
  2. 而看似异步的效果 实际上是由react的批量更新导致的
  3. 单对setState 这个方法来说则是负责创建更新 批不批量跟他没关系 不是异步的

React中对于更新的管理是通过UpdateQueue(更新队列) 管理的。是一个Priority Queue(有优先级的更新队列)。

而 setState 的作业就是创建一个update(更新)添加到更新队列里去。

用个简单的例子
代码
图片描述

这里不说 打印出来的 0 0 0 了

我们看反映到react中的更新队列
图片描述

  • 红框表示setstate创建的更新
  • 蓝框表示更新时传递的数据 payload
  • 绿框表示本次更新前的state初始值baseState

批量更新 相关(怎样触发批量更新的)

而这个批量更新在这块又涉及两个东西

  • dispatchInteractiveEvent$1(交互性的更新,ReactDom中的)
  • dispatchEvent

简单点就是ReactDom Render出来的组件,触发交互性的Event的时候就会(可以理解为触发交互时)

  1. 触发dispatchInteractiveEvent
  2. 然后一顿操作
  3. 触发dispatchEvent
  4. 触发 batchedUpdates 批量更新

batchedUpdates 批量更新里 由来自外面的一个默认值为false的变量isBatchingUpdates 来控制是否批量更新

在batchedUpdates中先将isBatchingUpdates 赋值为true。

然后开始执行触发这个Event的 handle 也就是我们自己编写的要干的事情 对应 图中代码handleClick;

最终在isBatchingUpdates ===true的环境中 执行3次setState将更新添加到更新队列(UpdateQueue)里

什么时候更新呢?
图片描述

batchedUpdates 里一个try{}finally{}在最终handle执行完后执行同步更新performSyncWork().

表现出来就是 异步的 效果 批量更新。

敲黑板

为了好理解点可以将这种EventHandle处理函数看成最终会转换成这样 当然没那么简单但是有利理解
图片描述
是不是有点眼熟?
是不是经常将setState写到方法最后
是不是你不将state在一起setState React来帮你做

划重点

更新队列

批量更新

ReactDom中的 交互性质的Event dispatchEvent触发批量更新

总结

与其说React setState 异步 不如 说react中的事件触发的更新会攒在一起批量更新。
同时呢 也启发我们写代码时 尽量能写一个setState的就不要拆开写

欢迎交流 修正 建议

一入前端深似海 学海无涯 回头是岸 ……

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3153/viewspace-2822639/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: python 库更新
请登录后发表评论 登录
全部评论

注册时间:2019-08-30

  • 博文量
    0
  • 访问量
    737