|
2 | 2 |
|
3 | 3 | 第一:
|
4 | 4 |
|
5 |
| -1. 使用reconciler(协调器)实现了一个reactDOM |
6 |
| -感觉很多都不太理解吧 |
| 5 | +1. 使用 reconciler(协调器)实现了一个 reactDOM |
| 6 | + 感觉很多都不太理解吧 |
7 | 7 |
|
8 | 8 | 2. Fiber 架构
|
9 | 9 |
|
10 |
| -2.1 代数效应做为思路去讲:在react中应用,和Generator |
| 10 | +2.1 代数效应做为思路去讲:在 react 中应用,和 Generator |
11 | 11 |
|
12 | 12 | React Fiber 可以理解为:
|
13 | 13 |
|
14 | 14 | React 内部实现的一套状态更新机制,支持任务不同的优先级,可中断与恢复,并且恢复后可以复用之前的中间状态
|
15 |
| -其中每个任务更新单元为react element 对应的Fiber节点 |
| 15 | +其中每个任务更新单元为 react element 对应的 Fiber 节点 |
16 | 16 |
|
17 |
| -2.2 Fiber架构的实现原理 |
18 |
| -主要是讲解了下FiberNode的结构 |
| 17 | +2.2 Fiber 架构的实现原理 |
| 18 | +主要是讲解了下 FiberNode 的结构 |
19 | 19 |
|
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 | + 并且关于两个棵之前替换,非常精彩 |
24 | 25 |
|
25 | 26 | 第二:前置知识
|
| 27 | + |
26 | 28 | - 源码的文件结构
|
27 | 29 | - 调试源码:下载起来确实很多环境问题
|
28 |
| -- 深入理解JSX:其实上次我看源码的时候,已经差不多解决了这部分内容 |
| 30 | +- 深入理解 JSX:其实上次我看源码的时候,已经差不多解决了这部分内容 |
29 | 31 |
|
30 |
| -其实整个线路都是围绕着fiber去讲的 |
| 32 | +其实整个线路都是围绕着 fiber 去讲的 |
31 | 33 |
|
32 | 34 | 架构篇
|
33 |
| -第三:render阶段 |
| 35 | +第三:render 阶段 |
| 36 | + |
34 | 37 | - 流程概述
|
35 |
| -先递后归 |
36 |
| -和遍历树一样 |
| 38 | + 先递后归 |
| 39 | + 和遍历树一样 |
37 | 40 |
|
38 | 41 | - beginWork
|
39 |
| -具体看src/Core/beginWork文件,并且是区别mount和update的 |
40 |
| -更具不同的类型,创建fiber,并且遍历树,并且节点上可能会存在effectTag |
| 42 | + 具体看 src/Core/beginWork 文件,并且是区别 mount 和 update 的 |
| 43 | + 更具不同的类型,创建 fiber,并且遍历树,并且节点上可能会存在 effectTag |
41 | 44 |
|
42 | 45 | - 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 | +单节点: |
46 | 62 |
|
| 63 | +1. 先判断 key 是否相同(这样就会知道为什么不能用 index 来充当 key,因为这样的话没有任何的作用) |
| 64 | +2. 再判断 type 是否相同 |
47 | 65 |
|
48 |
| -第四:commit阶段 |
| 66 | +多节点: |
| 67 | +Diff 算法的整体逻辑会经历两轮遍历 |
49 | 68 |
|
| 69 | +1. 第一轮,处理更新的节点 |
| 70 | +2. 第二轮,处理剩下的不属于更新的节点 |
50 | 71 |
|
| 72 | +第六:状态更新 |
51 | 73 |
|
| 74 | +创建 Update 对象 |
52 | 75 |
|
| 76 | +- ReactDOM.render |
| 77 | +- this.setState |
| 78 | +- this.forceUpdate |
| 79 | +- useState |
| 80 | +- useReducer |
0 commit comments