美文网首页
react-setState同步or异步?

react-setState同步or异步?

作者: 司萌萌_ | 来源:发表于2019-06-21 14:36 被阅读0次

开始使用react已经有快一年的时间了,但是对其背后的原理也好 实现也好,依然没有很清晰的概念,基本就是照搬前人的代码和使用方法了。

问题背景是这样的,之前 有写到 一个弹窗,在setState的时候将弹窗的visible设置为true,之后在回调里 通过 refs来获得这个弹窗元素,想象中是这样的,然而真的 实现起来发现这样是有问题的,log出来的弹窗dom元素是undefind?这说明 setState成功后,回调里并没有立即渲染?interesting。。。接着 我去了解了一下 setState相关的东西。

first,setState真的是异步么

答案是否定的,setState的同步异步取决于不同的调用场景。结论可以先说,在经过react包装的一些环境里,setState确实是异步执行的,而在未经过react包装比如settimeout&&原生事件里setState是同步的。我们可以大胆猜测,默认的情况下,setState是同步的,而在react里调用环境里,通过改变了一些数据,使得setState变成同步执行。


setState通常的运用场景:

1. 在生命周期里使用,其中一般运用较多的为componentDidMount,在这里setState以异步的方式执行。

2. 在react包装过的合成事件中执行setState,执行异步。

3.settimeout里调用setState,setState同步执行。

4.原生事件中,即用 addEventListener或者是document.querySelector().onclick的方式,在这些事件回掉里使用setState也会同步执行。

上文说到,react有一些magic操作来决定了要不要异步执行,首先,要明确的是,setState异步执行指的到底是什么,我们通常遇到的setState是batch操作,即当有一个setState被执行时,内部会创建一个待更新的队列。每一次setState都是往队列里推入新的东西。而在原生事件或者settimeout里,setState是立即执行,并不再是批量更新了。(恍然大悟哦,所以异步指的就是batch操作,并不是真正的异步!!)官方文档是这样介绍的:

将 nextState 浅合并到当前 state。这是在事件处理函数和服务器请求回调函数中触发 UI 更新的主要方法。不保证 setState 调用会同步执行,考虑到性能问题,可能会对多次调用作批处理。

setState被触发后,直接被塞到队列里等待更新还是 直接执行更新 取决于一个参数,isBatchingUpdates,默认的这个参数为false即不进行batch更新,在react合成事件和生命周期函数里会调用一个batchedUpdates 函数 ,将isBatchingUpdates修改为true。而在一些未经react包装过的事件处理中,因为状态值为false,就直接走了立即更新的操作。

然而 搞了半天 最初的困惑还是没有解决。。。。。。算了 再开一篇吧

相关文章

  • react-setState同步or异步?

    开始使用react已经有快一年的时间了,但是对其背后的原理也好 实现也好,依然没有很清晰的概念,基本就是照搬前人的...

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • 网络请求数据并且解析的过程(推荐AFNetworking)

    demo1.http请求,get同步异步,post同步异步get同步 get异步 post异步 2.session...

  • GCD队列、同步异步

    GCD队列、同步异步 GCD队列、同步异步

  • 存储

    同步 Set 异步 Get 同步 Get 异步 Get

  • GCD的几种创建方式及基本使用

    同步函数 同步函数+主队列 同步函数+串行队列 同步函数+并发队列 异步函数 异步函数+主队列 异步函数+串行队列...

  • GCD基础总结一

    上代码~ 同步串行队列 同步并行队列 异步串行队列 异步并行队列 主队列同步 会卡住 主队列异步

  • 谈论:同步异步阻塞非阻塞.md

    同步/异步:关注的方式(是否主动) 阻塞/非阻塞: 同步阻塞BIO: 同步非阻塞NIO: 异步非阻塞: 异步阻塞:

  • 📕 史上最实用的JS笔记

    1. 同步与异步 同步和异步的区别是什么?分别举一个同步和异步的例子 同步会阻塞代码执行,而异步不会阻塞代码执行。...

  • GCD 相关函数

    串行同步 串行异步 并行同步 并行异步 主队列同步 会死锁 主队列异步 异步处理耗时,回主线程刷新UI 栅栏函数 ...

网友评论

      本文标题:react-setState同步or异步?

      本文链接:https://www.haomeiwen.com/subject/ckhyqctx.html