现在我们已经使用requestIdCallback函数和fiber数据结构构建了一棵fiber树和dom关联起来了
但是还存在一个问题:
每次处理元素时,我们都会向DOM添加一个新的节点。
但是浏览器可能会在我们完成渲染整个树之前中断我们的工作。
那么这种情况下,用户可能会看到不完整的UI.
所以我们需要把performUnitOfWork中添加节点的代码移除。
然后我们使用wipRoot(work in progress root)
跟踪fiber树的根节点.
然后一旦我们完成整个树的渲染(没有下一个工作单元了),我们就提交整个fiber树给DOM
首先把performUnitOfWork函数中添加节点的代码移除
1 | function performUnitOfWork(fiber) { |
创建wipRoot,并初始化他
1 | let nextUnitOfWork = null;//下一个工作单元 |
1 | function render(element, container) { |
然后我们需要在workLoop循环结束后,判断是否可以提交
1 | function workLoop(deadline) { |
最后我们创建一个commitRoot函数用于提交
因为我们要用递归的方式把fiber树种的节点都提交了,所以我们使用一个commitWork用于递归提交
1 | //提交根节点给dom |