vue中的虚拟dom
什么是虚拟dom?
虚拟dom可以简单的用一句话概括,就是用普通的
js对象
来描述DOM结构,因为不是真实DOM,所以称之为虚拟DOM。
这个对象包含标签名 (tag)、属性 (attrs) 和子元素对象 (children) 三个属性,通过vue中的render()函数把虚拟dom编译成真实dom,在通过appendChild()添加到页面中。
简单来说:本质上是js对象,这个对象就是更加轻量级的对DOM的描述
为什么要创建虚拟dom?
创建真实DOM成本比较高,如果用 js对象来描述一个dom节点,成本比较低,另外我们在频繁操作dom是一种比较大的开销, 还可以对diff算法进行优化,所以建议用虚拟dom来描述真实dom。
vue中diff算法
diff算法就是进行虚拟节点对比,并返回一个
patch
对象,用来存储两个节点不同的地方,最后用patch记录的消息去局部更新Dom。
Diff算法的步骤:
- 用 JavaScript 对象结构表示 DOM 树的结构;然后用这个树构建一个真正的 DOM 树,插到文 档当中
- 当状态变更的时候,重新构造一棵新的对象树。然后用新的树和旧的树进行比较(diff),记录两棵树差异
- 把第二棵树所记录的差异应用到第一棵树所构建的真正的DOM树上(patch),视图就更新了