为了组织工作单元,我们需要一个数据结构:fiber
我们将为每个element使用一个Fiber,每个fiber都是一个工作单元
假设我们要渲染的元素树是这样的:
1 | render( |
在本次渲染中,我们将创建根fiber并将它设置为nextUnitOfWork
剩下的工作就都在performUnitOfWork
函数中进行。在该函数中,我们应该做三件事:
- 1、add the element to the DOM(向DOM树添加元素)
- 2、create the fibers for the element’s children(为当前fiber节点的孩子们创建fiber)
- 3、select the next unit of work(返回下一次循环要执行的fiber节点)
fiber这个data structure
(数据结构)的目标之一就是能很容易的找到下一个工作单元。
也就是为什么每个fiber都有一个连接指向它的第一个子节点、下一个兄弟节点、他的父节点
返回下一个工作单元的顺序是:它的孩子、兄弟、叔叔
首先把render函数中的代码提取成createDom函数(专门用来创建DOM节点)
我们需要把递归部分的代码去掉,createDom函数的作用只是用于创建dom,然后返回该dom
1 | function createDom(fiber) { |
然后我们应该在render函数中初始化nextUnitOfWork值,使得workLoop中的循环能够开始
1 | function render(element, container) { |
现在我们的循环启动了,所以我们需要完善performUnitOfWork函数,使他能够生成dom节点,然后为子元素生成fiber节点,最后返回下一个待执行的工作单元。
1 | //该函数不仅执行当前工作单元(即创建当前fiber对应的dom节点),然后返回下一个fiber |