虚拟dom和diff算法

什么是虚拟DOM?

一个虚拟dom其实质是一个js对象,用来保存真实DOM的层次关系和一些基本属性。

传统的DOM结构如下:

1
2
3
4
<ul id="list">
<li class="item1"> first </li>
<li class="item2"> second </li>
</ul>

相对应的可以表现为如下形式(虚拟DOM)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
tag: 'ul',
attr: {
id: list
},
children: [
{
tag: 'li',
attr: {
className: 'item1',
}
children: [
'first']
},{
tag: 'li',
attr: {
className: 'item2',
}
children: [
'second']
},
]
}
什么要使用虚拟的DOM?

将DOM抽象为虚拟的DOM,通过对比新旧两个虚拟DOM的差异(Diff算法),从而只把变化的部分重新渲染,提高渲染效率。

Diff算法

diff算法的实现流程如下:

image

react diff 算法(tree diff)

image