From 50affb80487a9ee9e99e0af22725bd6befb682a3 Mon Sep 17 00:00:00 2001 From: YuJian Date: Thu, 14 Apr 2022 17:10:30 +0800 Subject: [PATCH] vault backup: 2022-04-14 17:10:30 --- .../React 源码的碎片记录.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/自顶向下学 React 源码/React 源码的碎片记录.md b/自顶向下学 React 源码/React 源码的碎片记录.md index 3ab81df..83740ff 100644 --- a/自顶向下学 React 源码/React 源码的碎片记录.md +++ b/自顶向下学 React 源码/React 源码的碎片记录.md @@ -29,4 +29,9 @@ - createWorkInProgress 之后就开始 Fiber 的递归创建,也就是 beginWork 和 completeWork,可以小小的归结,beginWork 是在 Fiber 递的过程中不断地创建下一个子 Fiber 节点,而 completeWork 则是填充创建好的 Fiber - createWorkInProgress 的逻辑中,如果已经 alternate 存在,那么就会复用 Fiber,然后赋值同名参数,里边还会赋值 children - createWorkInProgress -> beginWork -> completeWork -- 首屏渲染时,会创建 Fiber 树的第一个节点 FiberNode,这个时候创建的 Fiber 树会被 FiberRootNode 的 current 指针指向,之后进入 createWorkInProgress 函数,会从 current 树的 alternate 属性中获取 workInProgress 的 FiberNode,由于首屏渲染,这个时候只存在一棵树那就是 current Fiber,这时就会创建有个新的 Fiber 节点作为 workInProgress 的 FiberNode,并赋值 current FiberNode 的同名属性,最后交由 beginWork 开始创建子 Fiber 节点,直到 Fiber 树完成生成,提交给 commit 阶段渲染到页面上,当第一次触发页面刷新,也会进入 createWorkInProgress,这是存在一个完备的 Fiber 树,也就是首屏渲染时生成的 workInProgress,但是在第一次页面更新,它已经是此次的 current Fiber 树,与首屏渲染时的 createWorkInProgress 不同,这次的 current Fiber 树的 FiberNode 已经存在,那么就不会创建新的 Fiber 节点,而是复用已有的 FiberNode,并赋值上同名属性,最后再交由 beginWork生成子 Fiber 节点,最后逻辑依旧,完成 FIber 树的生成之后 commit 渲染出页面,直到第二次渲染,这时两棵树 current Fiber 树和 WorkInProgress 树都已经存在 \ No newline at end of file +- 首屏渲染时,会创建 Fiber 树的第一个节点 FiberNode,这个时候创建的 Fiber 树会被 FiberRootNode 的 current 指针指向,之后进入 createWorkInProgress 函数,会从 current 树的 alternate 属性中获取 workInProgress 的 FiberNode,由于首屏渲染,这个时候只存在一棵树那就是 current Fiber,这时就会创建有个新的 Fiber 节点作为 workInProgress 的 FiberNode,并赋值 current FiberNode 的同名属性,最后交由 beginWork 开始创建子 Fiber 节点,直到 Fiber 树完成生成,提交给 commit 阶段渲染到页面上,当第一次触发页面刷新,也会进入 createWorkInProgress,这是存在一个完备的 Fiber 树,也就是首屏渲染时生成的 workInProgress,但是在第一次页面更新,它已经是此次的 current Fiber 树,与首屏渲染时的 createWorkInProgress 不同,这次的 current Fiber 树的 FiberNode 已经存在,那么就不会创建新的 Fiber 节点,而是复用已有的 FiberNode,并赋值上同名属性,最后再交由 beginWork生成子 Fiber 节点,最后逻辑依旧,完成 FIber 树的生成之后 commit 渲染出页面,直到第二次渲染,这时两棵树 current Fiber 树和 WorkInProgress 树都已经存在 +- beginWork 在页面更新时,会根据一些条件判断 didReceiveUpdate 的 true 或者 false,这个变量代表了,在本次更新中这个 Fiber 节点是否有变化,这些条件分别是 + 1. 是否有新旧 props + 2. context 是否发生变化 + 3. type 是否发生变化 +- 如果条件都为否,那么 didReceiveUpdate 变成 false zh \ No newline at end of file