每个 Virtual DOM 都可以表示为一个 fiber,如下图所示,每个节点都是一个 fiber。一个 fiber包括了 child(第一个子节点)、sibling(兄弟节点)、return(父节点)等属性。

PS:这里需要说明一下,Fiber 是 React 进行重构的核心算法,fiber 是指数据结构中的每一个节点,如下图所示的A1、B1都是一个 fiber。

实现虚拟 DOM 构建 fiber 树。

let A = {type: 'div',key: 'A',props: {children: [{ type: 'div', key: 'B1', props: { children: []} },{ type: 'div', key: 'B2', props: { children: []} }]}
}let workInProgress;
const TAG_ROOT = 'TAG_ROOT' // 根fiber
const TAG_HOST = 'TAG_HOST' // 原生DOM节点function workLoop () {while(workInProgress) {workInProgress = performaUnitOfWork(workInProgress)}
}let root = document.getElementById('root')
// fiber是一个普通的JS对象
let rootFiber = {tag: TAG_ROOT, // fiber类型key: 'ROOT', // 唯一标识stateNode: root, // fiber对应真实DOMprops: {children: [A] // 虚拟DOM成为根fiber唯一的children}
}function performaUnitOfWork(workInProgress) {beginWork(workInProgress)if (workInProgress.child) {return workInProgress.child}while(workInProgress) {if (workInProgress.sibling) {return workInProgress.sibling}workInProgress = workInProgress.return}
}
// 根据当前fiber和虚拟DOM构建fiber树
function beginWork(workInProgress) {console.log('beginWork', workInProgress.key)let nextChildren = workInProgress.props.childrenreturn reconcileChildren(workInProgress, nextChildren)
}
// 根据父fiber和子虚拟DOM,构建当前returnFiber的子fiber树
function reconcileChildren(returnFiber, nextChildren) {let previousNewFiber;let firstChildFiber;for (let newIndex = 0; newIndex < nextChildren.length; newIndex++) {let newFiber = createFiber(nextChildren[newIndex])newFiber.return = returnFiberif (!firstChildFiber) {firstChildFiber = newFiber} else {previousNewFiber.sibling = newFiber}previousNewFiber = newFiber}returnFiber.child = firstChildFiberreturn firstChildFiber
}
function createFiber (element) {return {tag: TAG_HOST,type: element.type,key: element.key,props: element.props}
}
// 当前真正执行的工作单元
workInProgress = rootFiber
workLoop()

fiber 节点包括了以下的属性:

(1)type & key

fiber 的 type 和 key 与 React 元素的作用相同。fiber 的 type 描述了它对应的组件,对于复合组件,type 是函数或类组件本身。对于原生标签(div,span等),type 是一个字符串。随着 type 的不同,在 reconciliation 期间使用 key 来确定 fiber 是否可以重新使用。

(2)stateNode

stateNode 保存对组件的类实例,DOM节点或与 fiber 节点关联的其他 React 元素类型的引用。一般来说,可以认为这个属性用于保存与 fiber 相关的本地状态。

(3)child & sibling & return

child 属性指向此节点的第一个子节点(大儿子)。sibling 属性指向此节点的下一个兄弟节点(大儿子指向二儿子、二儿子指向三儿子)。return 属性指向此节点的父节点,即当前节点处理完毕后,应该向谁提交自己的成果。如果 fiber 具有多个子 fiber,则每个子 fiber 的 return fiber 是 parent 。

所有 fiber 节点都通过以下属性:child,sibling 和 return来构成一个 fiber node 的 linked list(后面我们称之为链表)。如下图所示:

Fiber 数据结构是怎样的?相关推荐

  1. React Fiber 数据结构揭秘

    此章节会通过两个 demo 来展示 Stack Reconciler 以及 Fiber Reconciler 的数据结构. 个人博客 首先用代码表示上图节点间的关系.比如 a1 节点下有 b1.b2. ...

  2. 手写 React 第 4 节 - 实现 Fiber

    手写 React 第 4 节 - 实现 Fiber 前言 1. Fiber 的作用 2. Fiber 数据结构 3. 实现 Fiber 前言 在上一节[手写 React 第 3 节 - 实现函数组件/ ...

  3. React Fiber 原理

    持续学习中- 源码版本: v17.0.1, 官方源码地址 源码调试教程 调试的源码 画图软件 浏览器的一帧 浏览器中, 页面都是一帧一帧的绘制出来的, 渲染的帧率和设备的刷新率是一致的, 以常用的显示 ...

  4. React源码解读之React Fiber

    开始之前,先讲一下该文章能帮你解决哪些问题? 开始之前,先讲一下该文章能帮你解决哪些问题? facebook为什么要使用重构React React Fiber是什么 React Fiber的核心算法 ...

  5. 【react】什么是fiber?fiber解决了什么问题?从源码角度深入了解fiber运行机制与diff执行

    壹 ❀ 引 我在[react] 什么是虚拟dom?虚拟dom比操作原生dom要快吗?虚拟dom是如何转变成真实dom并渲染到页面的?一文中,介绍了虚拟dom的概念,以及react中虚拟dom的使用场景 ...

  6. 从0实现react框架,React Fiber架构和Fiber Diff算法

    react框架是目前最为流行的前端框架之一,尤其在很多大厂,应用更为广泛.相对于一些mvvm框架,react上手需要一定的技术基础,但掌握后,编码体验和性能是很不错的.react整体思想是函数式编程, ...

  7. react div 事件优先级_React 架构的演变 更新机制

    前面的文章分析了 Concurrent 模式下异步更新的逻辑,以及 Fiber 架构是如何进行时间分片的,更新过程中的很多内容都省略了,评论区也收到了一些同学对更新过程的疑惑,今天的文章就来讲解下 R ...

  8. React-fiber架构的解释

    React-fiber架构解析 什么是fiber React中虚拟dom是对真实dom的一种简化,但是一些真实dom能做的事情,虚拟dom做不了,于是就有了fiber,fiber其实是指一种数据结构, ...

  9. React源码解毒 - render方法解析

    render方法解析 要将react元素渲染到页面当中,分为了两个阶段: render阶段 和 commit阶段. render阶段:由协调层负责的阶段 在这个阶段当中要为每一个react元素构建对应 ...

最新文章

  1. 蓝桥杯 最长公共子序列
  2. 后盾网lavarel视频项目---5、淘宝镜像cnpm的原理及如何使用
  3. 使用redis作为Return存储方式
  4. java 分贝_java11教程--jhsdb命令
  5. 定时器中断实验 编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
  6. php如何统计数组的个数,如何用php统计数组元素的个数(附代码)
  7. 更改sql-2008sa密码
  8. CSS学习笔记(四)CSS字体属性
  9. java异常处理 ppt_Java异常处理、多线程ppt课件
  10. OpenShift 4 之Service Mesh教程(1)- 创建ServiceMesh环境,部署Istio的微服务
  11. 在WSL2上运行nVIDIA Nsight
  12. wince车机刷系统刷机包_2020年刷机包是不是越小越精简,越小越流畅好用
  13. python商品总数抹零_销售发货单
  14. java移库数据同步,洗车管理系统会员管理+门店店务同步管理
  15. 淘宝按图搜索商品(拍立淘)、图片上传API接口、图片识别商品接口img2text标题栏、链接及图片相关参数字段API数据获取调用示例
  16. 计算机网络中期论文,计算机 毕业论文(设计)中期报告
  17. 在线图片转文字怎么转?这两种方法简单又实用!
  18. java使用微博开发者api步骤
  19. uniapp 动态插槽 slot 兼容微信小程序 h5 APP
  20. 网易云轻舟设计理念与技术选型

热门文章

  1. 长沙 · 中国1024程序员节盛况空前,500 万程序员线上线下引爆星城
  2. 百度CTO王海峰出席科协年会重头论坛,展现智能云产业智能化硕果
  3. 程序员,别逼自己学 AI 了,掌握正确的方法,开发水平暴增!
  4. 爱奇艺网络协程编写高并发应用实践
  5. QT 框架搭建,用最原始的方法实现简单的塔防游戏 | 原力计划
  6. 你离黑客的距离,就差这 20 个神器了 | 原力计划
  7. 漫画:为什么生僻字计算机上打不出来,或者打出来也无法显示呢?
  8. Spring Boot 2.2 正式发布,性能大幅提升、Java 13 支持|CSDN博文精选
  9. 任何人都可以胜任全栈开发?
  10. 程序员破解推荐系统瓶颈,带来超百亿收入增量!