将一个jsx的多叉树转为Fiber树

前言

在React中会将我们写的组件转为jsx的多叉树,最后转为fiber树,他是如何转化的呢,今天我们一起探索下吧。

jsx多叉树

一个简单的jsx对象有如下属性:

go 复制代码
const jsx = {
    type:'div',
    key: 1,
}
// 其余的属性我们省略掉,暂时用不到

fiber

一个fiber对象的简单属性有以下5个:

kotlin 复制代码
const fiber = {  
    type: 'div', // 节点的类型 
    key: 1, 
    child: null,        // 子Fiber节点  
    sibling: null,     // 兄弟Fiber节点  
    return: null,      // 父Fiber节点(在递归过程中设置)  
 }; 

实现

有如下一个jsx的多叉树,我们需要转为图二的fiber

  • 图一,
  • 图二
  • 第一步:我们首先传入jsx根节点,创建出根节点对应的fiber
  • 第二步:我们判断jsx根节点有没有children,如果有,那么我们遍历递归创建childFiber
    • 当创建好childFiber后,我们需要将childFiber.return指向其父fiber节点,
    • 其次我们还需要判断childFiber是不是第一个子节点,如果是设置fiber.child = childFiber;
    • 如果不是第一个子节点,我们需要在遍历创建之前记录子节点的最后一个节点lastChildFiber,然后让lastChildFiber.siblings指向新创建的childFiber
javascript 复制代码
const createFiber = (jsxNode) => {
    // 创建Fiber节点
    const fiber = {
        type: jsxNode.type, // JSX节点的类型
        key: jsxNode.key,
        child: null,        // 子Fiber节点
        return: null,       // 兄弟Fiber节点
        siblings: null,     // 父Fiber节点(在递归过程中设置)  
    }
    
    // 如果JSX节点有子节点,递归创建Fiber子树 
    if(jsxNode.children && jsxNode.children.length > 0) {
        let lastChildFiber = null;
        for(let i = 0; i < jsxNode.children.length; i++){
            const childFiber = createFiber(jsxNode.children[i])
            
            // 设置子Fiber节点的return属性指向当前Fiber节点  
            childFiber.return = fiber;
            
            // 如果是第一个子节点,则设置为child属性  
            if(!fiber.child) {
                fiber.child = childFiber
            } else {
            // 否则,将其设置为上一个子节点的sibling属性  
                lastChildFiber.next = childFiber
            }
            // 更新最后一个子节点的引用  
            lastChildFiber = childFiber
        }
    }
    
    return fiber
}
  • 上面这样,我们就实现了一个简单的将jsx树转为fiber树的算法。
  • 后面我们会在此基础上实现react diff,以及可中断的diff.
相关推荐
DevUI团队2 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600443 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
avi91113 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen3 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
IT_陈寒3 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端
用户938515635074 小时前
Type vs Interface:读完这篇就没有面试官能难倒你了
前端·面试·typescript
用户938515635074 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
油丶酸萝卜别吃4 小时前
jquery-ajax.js 说明文档
前端·javascript·jquery
windliang4 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
柒和远方5 小时前
V063: TS 面试必考:interface 与 type 的四大差异,与 LLM Harness 的自动化择优
前端·javascript