🌙 React 虚拟DOM
虚拟 DOM 到底是什么,说简单点,就是一个普通的 JavaScript 对象,包含了 tag、props、children 三个属性。
<table class="table">
<tr>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>1</td>
</tr>
</table>
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
上面的 HTML 转换为虚拟 DOM 如下:
const VDOMRoot = {
type: 'table',
props: { className: 'table' },
children: [
{
type: 'tr',
props: { },
children: [
{
type: 'td',
props: { },
children: [{type: 'text', value: '1'}]
},
{
type: 'td',
props: { },
children: [{type: 'text', value: '1'}]
}
]
},
{
type: 'tr',
props: { },
children: [
{
type: 'td',
props: { },
children: [{type: 'text', value: '1'}]
}
]
}
]
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
先来看看fiber node:
function FiberNode (tag, key) {
// 节点 key,主要用于了优化列表 diff
this.key = key
// 节点类型;FunctionComponent: 0, ClassComponent: 1, HostRoot: 3 ...
this.tag = tag
// 子节点
this.child = null
// 父节点
this.return = null
// 兄弟节点
this.sibling = null
// 更新队列,用于暂存 setState 的值
this.updateQueue = null
// 节点更新过期时间,用于时间分片
// react 17 改为:lanes、childLanes
this.expirationTime = NoLanes
this.childExpirationTime = NoLanes
// 对应到页面的真实 DOM 节点
this.stateNode = null
// Fiber 节点的副本,可以理解为备胎,主要用于提升更新的性能
this.alternate = null
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
上述dom转为fiber node:
// 有所简化,并非与 React 真实的 Fiber 结构一致
const FiberRoot = {
type: 'table',
return: null,
sibling: null,
child: {
type: 'tr',
return: FiberNode, // table 的 FiberNode
sibling: {
type: 'tr',
return: FiberNode, // table 的 FiberNode
sibling: null,
child: {
type: 'td',
return: FiberNode, // tr 的 FiberNode
sibling: {
type: 'td',
return: FiberNode, // tr 的 FiberNode
sibling: null,
child: null,
text: '1' // 子节点仅有文本节点
},
child: null,
text: '1' // 子节点仅有文本节点
}
},
child: {
type: 'td',
return: FiberNode, // tr 的 FiberNode
sibling: null,
child: null,
text: '1' // 子节点仅有文本节点
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35