什么是虚拟DOM
一个能代表DOM树的对象,通常含有标签名,标签上的属性、事件监听和子元素,以及其他属性
虚拟DOM的优点
1. 能减少不必要的DOM操作
例如添加你需要添加1000个DOM元素,你可能会一个接一个的添加。而虚拟DOM就可以将所有添加操作合并为一次。
2. 减少操作的范围
虚拟DOM可以借助DOM diff把多余的操作省掉,比如你添加1000个节点,其实只有10个新增的。
3. 跨平台
虚拟DOM本质就是js对象,它还可以使用在其他的平台中:小程序、ios应用、安装应用。
虚拟DOM的缺点
需要额外的创建函数,如createElement或h,但可以通过JSX来简化成XML写法。同时也导致了严重依赖打包工具的问题,React使用babel解析,Vue使用Vue-loader解析。
DOM diff
DOM diff就是一个对比虚拟DOM的操作。
Tree diff
-
将新旧的两颗树逐层对比,找出那些需要更新的节点
-
如果节点是组件就看Component diff 如果是节点是标签就看Element diff
Component diff
-
查看组件类型,类型不同直接替换
-
类型相同只更新相应的属性
-
然后深入组件做Tree diff(递归)
Element diff
-
看标签名,标签名不同直接替换,相同则更新属性
-
然后进入后代标签做Tree diff(递归)
总而言之DOM diff就是对比出两颗树不同的地方做修改