待了解的问题:
- setState 同步异步的问题
- setState为啥在合成事件和生命周期内是异步的,在原生事件和setTimeout中是同步的
setState 同步异步的问题
-
同步,异步的解释
这里异步的意思,并不是我们常说的那个“异步”,而是更新事件调用后,无法立刻拿到更新后的值。
-
异步的意义
可以实现批量更新,将同一时期内的更新事件,在合适的时机,一起更新。避免了频繁更新导致的性能问题
setState为啥在合成事件和生命周期内是异步的,在原生事件和setTimeout中是同步的
合成事件和生命周期内:setState后会经历收集更新的一个流程,在可执行更新的时候,会执行更新方法去更新待更新集合内的数据,然后渲染到UI上。
原生事件,并没有经历收集更新的这个流程,会直接执行更新方法,然后渲染到UI,此时可以得到更新后的数据
setTimeout 在 合成事件和生命周期内 时,因为收集更新的方法中,执行了 setTimeout 方法,会将 里面的方法 放到了队列的最后,待执行该方法时,已经错过了加入批量更新队列,于是走了一条跟原生事件差不多的路,所以在setTimeout中的setState调用 后,可以立刻得到更新后的值。