1
0
Fork 0
Browse Source

vault backup: 2022-04-20 09:00:20

master
YuJian 3 years ago
parent
commit
8a24dda8d5
  1. 2
      .obsidian/plugins/obsidian-git/data.json
  2. 2
      .obsidian/plugins/obsidian-minimal-settings/data.json
  3. 6
      React 的源码深入/React Reconciler - Fiber 创建.md

2
.obsidian/plugins/obsidian-git/data.json

@ -3,7 +3,7 @@ @@ -3,7 +3,7 @@
"autoCommitMessage": "vault backup: {{date}}",
"commitDateFormat": "YYYY-MM-DD HH:mm:ss",
"autoSaveInterval": 5,
"autoPullInterval": 1,
"autoPullInterval": 0,
"autoPullOnBoot": false,
"disablePush": false,
"pullBeforePush": true,

2
.obsidian/plugins/obsidian-minimal-settings/data.json

@ -37,5 +37,5 @@ @@ -37,5 +37,5 @@
"underlineInternal": true,
"underlineExternal": true,
"useSystemTheme": false,
"folding": true
"folding": false
}

6
React 的源码深入/React Reconciler - Fiber 创建.md

@ -1,4 +1,4 @@ @@ -1,4 +1,4 @@
> React 从 16 开始,对底层架构做了一次重构,和 15 不同,渲染 vdom 的时候一改以往的递归执行,引入了一个新的概念,叫做 Fiber,虽然最后渲染到页面的时候还是递归,但是 Fiber 的递归是可以中断的,根据优先级由浏览器优先执行任务,保证在大量视图需要更新的时候,浏览器仍然能保证快速的响应
>React 从 16 开始,对底层架构做了一次重构,和 15 不同,渲染 vdom 的时候一改以往的递归执行,引入了一个新的概念,叫做 Fiber,虽然最后渲染到页面的时候还是递归,但是 Fiber 的递归是可以中断的,根据优先级由浏览器优先执行任务,保证在大量视图需要更新的时候,浏览器仍然能保证快速的响应
在 React 中,视图的更新使用了双缓存的方式,也就是说在 React 运行时,同时有着两棵 Fiber 树,一颗是当前视图上的 Fiber 树,叫 current,另外一棵是存在内存当中的下一次视图更新时用的叫做 workInProgress,React 在构建时会创建整个 app 唯一的根 Fiber 节点,叫做 FiberRootNode,这个节点上有一个 current 指针,指向的是当前正在页面上显示的 Fiber 树也就是 current,当 workInProgress 递归生成完毕,指针会立即指向 workInProgress ,而旧的 current 就会在下一次渲染中变成 workInProgress ,就这样循环交替完成页面的递归渲染
本次源代码解读的 DEMO 只用了最简单的 useState 做计数器修改触发页面刷新,并没有新增新的DOM 节点之外的其他操作,第一次和第二次和之后页面刷新实际上都只是 useState 触发变化并在页面上显示计数内容出现变化
@ -13,7 +13,7 @@ createWorkInProgress 之后,Fiber 的操作就会交由 beginWork 和 complete @@ -13,7 +13,7 @@ createWorkInProgress 之后,Fiber 的操作就会交由 beginWork 和 complete
### beginWork
> beginWork 执行在递归节点的 Fiber 创建之前,主要是为传入的 Fiber 节点根据类型创建第一个子 Fiber 节点
>beginWork 执行在递归节点的 Fiber 创建之前,主要是为传入的 Fiber 节点根据类型创建第一个子 Fiber 节点
首先会对 current 做空值判断,因为对于首屏渲染而言,当前传入的 current Fiber 节点是 FiberNode,所以是存在的,会进入 current !== null 的逻辑,然后会判断当前 Fiber 节点是否发生变化,然后赋值 didReceiveUpdate 做更新标识,判断的条件如下:
1. 新旧 props 是否相同
@ -38,7 +38,7 @@ updateHostRoot 函数中首先会执行 pushHostRootContext 方法,这个方 @@ -38,7 +38,7 @@ updateHostRoot 函数中首先会执行 pushHostRootContext 方法,这个方
### completeWork
> completeWork 执行在递归节点的 Fiber 创建之后,主要是为创建好的 Fiber 节点插入内容和插入真实 DOM 树
>completeWork 执行在递归节点的 Fiber 创建之后,主要是为创建好的 Fiber 节点插入内容和插入真实 DOM 树
函数开始,会执行 popTreeContext 并传入 workInProgress,这个函数应该也和 Context 相关,然后进入到 swtich 逻辑,根据 WorkInProgress Fiber 节点的 tag 属性进入不同的 case 逻辑,这里和 beginWork 基本上类似
React 的遍历顺序是从父到子,最终再从子回到父,所以首屏渲染中首先进入 completeWork 的 WorkInProgress 不一定会是 FiberNode ,在这里是 HostComponent

Loading…
Cancel
Save