Vue的$nexttick采用mo来保证dom渲染
而setTimeout比micro更加推迟,nexttick里的低版本浏览器退位也是用settimeout实现的
那么react里 是否能保证在整个render过程中,uirender仅在一个event loop里执行?如果如此,那么setTimeout必定能保证dom渲染
没看过react源码,请教一个各位大神.
Vue的$nexttick采用mo来保证dom渲染
而setTimeout比micro更加推迟,nexttick里的低版本浏览器退位也是用settimeout实现的
那么react里 是否能保证在整个render过程中,uirender仅在一个event loop里执行?如果如此,那么setTimeout必定能保证dom渲染
没看过react源码,请教一个各位大神.
我记得 setTimeout 是在 render 之后执行的,而你说的过程其实生命周期引发的吧?这种情况相当于重新执行了一遍 render,所以也比 event loop 开始要靠前。
刚写过一个帖子,涉及到了一点点vue的nexttick()函数;
vue2.0之前延时优先级是promise -> mutationObserver -> setTimeout
搞定延时函数;
微任务优先宏任务的两点好处是:
1.更快的拿到更新后的数据;
2.浏览器在每次宏任务执行后会插入UI渲染,setTimeout会有2次渲染的弊端。
所以,setTimeout仅仅是兼容性。
目前采用的是MessageChannel
;
react中基本原理是不变的,保证兼容性的情况下,一定会采用微任务处理,setTimeout不存在兼容问题作为备选存在。不使用异步的话,在mutationEvents利用事件绑定证明bug颇多,无力解决。
最后,能否确认在一个event loop
中执行,要看执行环境setTimeout
必定能够保证一次渲染,答案是肯定的。
https://www.jianshu.com/p/ab5... 文章最下面,是有关vue的延时函数的解释,有兴趣可以看看
13 回答12.8k 阅读
8 回答2.5k 阅读
2 回答5k 阅读✓ 已解决
9 回答1.6k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
5 回答805 阅读
6 回答908 阅读
不能,而且将来的版本可能更加激进地调度render task。
如果你需要依赖DOM更新做什么事,可以学习用hook。