按照我目前的理解,虚拟dom的优势在于把当前的变化打包给浏览器,让浏览器一次性更新,而不是来一个更新一个,减少页面的回流和重绘.
但是如果只有一个按钮, 点一下文字变色或者改变某个元素的显隐性,那么这种操作浏览器应该本身就是只回流/重绘一次,这个时候虚拟dom还有优势吗?
还有个小问题: 默认浏览器是怎么更新元素的?
- 如果我一次
display:none
了页面中的9个元素,那么在没有虚拟dom的情况下,浏览器会回流/重绘9次吗 - 虚拟dom把产生的"补丁包"推给浏览器,有多个元素发生了变化,浏览器是怎么把他们渲染出来的,重新生成
DOM
和CSSOM
吗
先谢谢大佬!!!
Q1:
那肯定是原生直接操作 DOM 更快。
但问题是这种简单页面的场景为啥你要用 MVVM 框架?
P.S. 推荐看这篇尤大亲自答:https://www.zhihu.com/questio...
Q2:
这里的“一次”,我理解为是一段代码里连续控制 9 个元素隐藏,类似:
那么答案是不一定。
老浏览器的话是回流 9 次(没错,就说你呢,明天就要退休的 IE)。现代浏览器会有渲染队列来对这种场景做优化,一段时间内的重复回流操作会被合并(但要注意这里的队列可能会被另一些操作打断并清空,比如
getBoundingClientRect
、getComputedStyle
等等,这也很好理解,这些操作是要获取当前 DOM 状态的,自然要必须强制触发一次回流才可以拿到实时状态)。而回流必然会重绘,重绘不一定回流。所以次数这里两者是一样的。
Q3:
这个问题太大了,三两句话说不清。先占坑,等有时间了补。