什么是虚拟DOM?
虚拟DOM其实就是真实DOM的一种映射,他的本质就是一个JS对象,就是对真实DOM进行描述的。
为什么要用虚拟DOM?
因为真实的DOM包含的属性太多了,如果直接操作真实DOM,会重复的造成回流和重绘,导致性能不好,而虚拟DOM就不会有这个问题。
什么时候用虚拟DOM(什么时候生成)?
一般在页面挂载前的时候,即beforeMount的时候创建一个虚拟的DOM树,当你对标签操作更新时,即beforeUpdate的时候,又会重新生成一个虚拟DOM树,两个虚拟DOM树进行对比,虚拟DOM是深度遍历,然后用diff算法进行计算,如果有不同的地方就更新,可以很明显的提升渲染效率以及用户体验,虚拟DOM的最大优势是跨平台,跨终端,一套代码,可以生成不同的平台的最终代码 。
什么是diff算法?
分情况计算:
第一种:节点改变,直接把改变的区域销毁重建。
第二种:节点没变,属性或内容变了,哪里变了更新哪里就行
第三种:v-for遍历的时候。这种情况下又有两种情况。 1.没有key的时候,或者key的值为index索引的时候,这个时候就地复用(就地更新),就是按照从上到下,一一对应的关系进行对比,这时就会产生一个问题,万一你开头或者中间添加了新节点,其他地方不变,但是他是一一对应的关系,就会认为你变了,就会把没必要的元素也全部更新。
2.加了key且不为index,则对比计算时,就有唯一标识方便新旧虚拟DOM查找,就像人的身份证号一样的,有了这个之后,哪怕是顺序被打乱了,但是vue知道只要key一样就是同一个元素哪里变了改哪里,就不用全部更新了,提高性能。