Skip to content

Commit a456fea

Browse files
add: 看到状态更新这部分了
1 parent 62107e5 commit a456fea

File tree

1 file changed

+49
-21
lines changed

1 file changed

+49
-21
lines changed

README.md

Lines changed: 49 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,79 @@
22

33
第一:
44

5-
1. 使用reconciler(协调器)实现了一个reactDOM
6-
感觉很多都不太理解吧
5+
1. 使用 reconciler(协调器)实现了一个 reactDOM
6+
感觉很多都不太理解吧
77

88
2. Fiber 架构
99

10-
2.1 代数效应做为思路去讲:在react中应用,和Generator
10+
2.1 代数效应做为思路去讲:在 react 中应用,和 Generator
1111

1212
React Fiber 可以理解为:
1313

1414
React 内部实现的一套状态更新机制,支持任务不同的优先级,可中断与恢复,并且恢复后可以复用之前的中间状态
15-
其中每个任务更新单元为react element 对应的Fiber节点
15+
其中每个任务更新单元为 react element 对应的 Fiber 节点
1616

17-
2.2 Fiber架构的实现原理
18-
主要是讲解了下FiberNode的结构
17+
2.2 Fiber 架构的实现原理
18+
主要是讲解了下 FiberNode 的结构
1919

20-
2.3 Fiber架构的工作原理
21-
- 双缓存,和GPU原理差不多
22-
即:curren Fiber Tree 和 workInProgress Fiber Tree
23-
并且关于两个棵之前替换,非常精彩
20+
2.3 Fiber 架构的工作原理
21+
22+
- 双缓存,和 GPU 原理差不多
23+
即:curren Fiber Tree 和 workInProgress Fiber Tree
24+
并且关于两个棵之前替换,非常精彩
2425

2526
第二:前置知识
27+
2628
- 源码的文件结构
2729
- 调试源码:下载起来确实很多环境问题
28-
- 深入理解JSX:其实上次我看源码的时候,已经差不多解决了这部分内容
30+
- 深入理解 JSX:其实上次我看源码的时候,已经差不多解决了这部分内容
2931

30-
其实整个线路都是围绕着fiber去讲的
32+
其实整个线路都是围绕着 fiber 去讲的
3133

3234
架构篇
33-
第三:render阶段
35+
第三:render 阶段
36+
3437
- 流程概述
35-
先递后归
36-
和遍历树一样
38+
先递后归
39+
和遍历树一样
3740

3841
- beginWork
39-
具体看src/Core/beginWork文件,并且是区别mount和update的
40-
更具不同的类型,创建fiber,并且遍历树,并且节点上可能会存在effectTag
42+
具体看 src/Core/beginWork 文件,并且是区别 mount 和 update 的
43+
更具不同的类型,创建 fiber,并且遍历树,并且节点上可能会存在 effectTag
4144

4245
- completeWork
43-
给有effectTag的Fiber节点执行对应操作,根据fiber不同类型处理
44-
分为update和mount:mount会将fiber实例化成dom,并且两个过程都会处理属性,事件等
45-
最后,将有effectTag的fiber挂载在父级的fiber的effectList末尾,并返回一个workInProgress
46+
给有 effectTag 的 Fiber 节点执行对应操作,根据 fiber 不同类型处理
47+
分为 update 和 mount:mount 会将 fiber 实例化成 dom,并且两个过程都会处理属性,事件等
48+
最后,将有 effectTag 的 fiber 挂载在父级的 fiber 的 effectList 末尾,并返回一个 workInProgress
49+
50+
第四:commit 阶段
51+
52+
实现篇
53+
第五:Diff 算法
54+
55+
为了降低算法复杂度,React 的 diff 会预设三个限制
56+
57+
1. 只对同级元素进行 Diff。如果一个 DOM 节点在前后两次更新中跨越了层级,那么 React 不会尝试复用他
58+
2. 两个不同类型的元素会产生不同的树,如果元素由 div 变成 p,react 会销毁 div 及其子孙节点,并新建 p 以及其子孙
59+
3. 开发者可以通过 key prop 来暗示哪些子元素在不同的渲染下能保持稳定
60+
61+
单节点:
4662

63+
1. 先判断 key 是否相同(这样就会知道为什么不能用 index 来充当 key,因为这样的话没有任何的作用)
64+
2. 再判断 type 是否相同
4765

48-
第四:commit阶段
66+
多节点:
67+
Diff 算法的整体逻辑会经历两轮遍历
4968

69+
1. 第一轮,处理更新的节点
70+
2. 第二轮,处理剩下的不属于更新的节点
5071

72+
第六:状态更新
5173

74+
创建 Update 对象
5275

76+
- ReactDOM.render
77+
- this.setState
78+
- this.forceUpdate
79+
- useState
80+
- useReducer

0 commit comments

Comments
 (0)