Fibers
为了组织工作单位,我们将需要一个数据结构:fiber three。
我们让每个元素对应一个 fiber,每个 fiber 都是一个工作单位。
举个例子:
加入我们需要渲染的元素树如下:
在渲染时,我们将创建 root fiber,并将其设置为下一个工作单元 nextUnitOfWork
,其他的处理则在 performUnitOfWork
函数中执行,该函数主要做三件事:
- 把元素添加到 dom 中
- 为元素的子元素都创建一个 fiber 结构
- 找到下一个工作单元
采用 fiber 数据结构的原因在于更方便的找到下一个工作单元。如图,每个 fiber 都会链接到其 子节点、兄弟节点和父节点。
流程就不翻了,大致意思就是 父找子,无子则找弟,无子无弟则找父
接下来,修改 render
函数代码,
第一步:抽出 createDom
用于创建 dom 节点
第二步:在 render
函数中设置 nextUnitOfWork
,作为 fiber tree 的根节点
至此,当浏览器空闲时,则会执行上一节实现的 workLoop
函数,即开始执行 fiber tree 的根节点工作单元。
第三步:实现 performUnitOfWork
函数