图解React Diff算法及新架构Fiber

简介: 阿里云前端工程师靖鑫带来了React高阶组件在业务场景中的应用。首先从高阶组件的思想开始谈起,帮助我们灵活管理代码,介绍了简单的HOC示例、传递参数的HOC示例、反向继承HOC,进而讲述了HOC库recompose,然后通过图解重点说明了DOM DIFF算法,最后对新架构Fiber进行了简要介绍。

阿里云前端工程师靖鑫带来了React高阶组件在业务场景中的应用。首先从高阶组件的思想开始谈起,帮助我们灵活管理代码,介绍了简单的HOC示例、传递参数的HOC示例、反向继承HOC,进而讲述了HOC库recompose,然后通过图解重点说明了DOM DIFF算法,最后对新架构Fiber进行了简要介绍。


数十款阿里云产品限时折扣中,赶快点击这里,领券开始云上实践吧!

直播视频精彩回顾

以下是精彩视频内容整理:

什么是高阶组件?

所谓高级组件本质上就是一个函数,接收一个组件后返回另外一个新的组件,这么做的意图就是为了增强(enhance),比如装饰、增添行为、增添逻辑等,都可以放在高阶组件中,高阶组件是一种可以增强组件的能力。

最简单的HOC示例

ac076ff9347e966af26d740e77dddf1b73b4e5ba

如图所示,使用装饰器方式来使用,声明一个函数,定义一个高阶组件,给目标组件包裹一层样式。接收一个组件,返回一个函数式组件props,将props全部解构传递给wrappedcomponent,高阶组件一定不可以影响原来的业务。在此基础上,我们在外面增加一些能力,比如在被包裹的组件外围,由一个card的dom元素包裹在一起。

传递参数的HOC示例

808404938cfc12629b6e43a59ebda784e1820896

首先设置参数,生成特定的HOC,再传递给目标组件使用。定义一个stylefactory方法,返回高阶组件,而不是组件。在高阶组件的前一步做了一层处理,利用闭包思想,它的入参是classname,返回的高阶组件一直内嵌classname。

反向继承HOC

00c34027b89082d22c1b99b21cf504194b1b68bb

前两种高阶组件的特点是不会修改原来的组件,只是在上面包裹一些东西。而有时会更改渲染逻辑,比如当wrappedcomponent资源没有加载回来时,页面显示loading,加载完成后才会显示,这就需要更改显示逻辑。反向继承HOC返回的React组件继承了被传入的组件,既然继承了被传入组件,是不是所有方法都可以使用呢?比如在render方法中渲染出之前的内容,可以直接使用super.render(),我们可以在render方法中重新写一个render,这样原有内容就都展示不出来了,想展示原有内容只需要调用super.render()即可。所以它能够访问到的区域、权限更多,相比属性代理方式,它更像打入组织内部,对其进行修改。

 

脑洞大开的HOC库——recompose

Recompose有很多很多实用的库,下面为大家介绍几个常见场景应用。

e1ead119a750b3d7712a0957470a79c138e729da

第一个情景是展示哪一个。有些时候,你需要根据后端返回值来做决策,例如展示Loading组件,之前你可能会将这部分判断写在render方法里,现在你可以将它们抽离出来了,将判断逻辑提前拿出来,我们的组件尽可能都是函数组件,不需要额外维护状态。顺带也可以将生命周期等方法挪出来,用高阶组件lifecycle代替。

如图所示,高阶组件是一层层被包裹起来的,最里面为wrappedcomponent组件,外部包裹一层branch高阶组件,branch专门用来做条件判断的,根据某一个值去判断真假,如果是真就会直接加载loading组件传递给你的业务组件,如果是假就会把另外一个高阶组件传递给你的业务组件,我们不需要在render方法里做这个判断。然后将代码发起请求的方式拿到lifecycle中去做,lifecycle本身可以写一些生命周期方法,state修改完后传递到branch高阶组件中透传,最终到达业务组件。

674a0d435f9487252ef1dfc97771b894db352637

第二个情景是维护组件自身的State。我们经常会有Tab切换,选择第一个、选择第二个等,将高亮的加上classname,点击展开(收起)等与业务数据无关的状态需要维护,回想以前的代码,我们可能会使用setState,但有时侯state和setstate不是很方便,组件可能非常长,也可能与真实业务代码融合在一起,容易使开发者混淆逻辑。有了recompose,我们可以使用withState和withHandlers来避免手动setState的出现,将展示逻辑和UI进行分离。

7649af3712a0e32015dbd24ec346544dfd690121

第三个情景是组件嵌套。在实际项目中,我们会有多个地方使用到Modal组件,如果都重复一遍上述代码,boilerplate代码将非常多,为此,我们可以将它转变为一个高阶组件,与常规方式不同,我们本次使用recompose提供的HOC来组织我们的代码。

 

DOM DIFF算法简析

b433a32607d8b1a89fa0a44e9155ad7d94e4d8d1

DOM DIFF是react应用中的精华所在,DOM DIFF在使用时有一些约定如下:

1.         DOM节点跨层级的移动操作特别少,可以忽略不计(例如A原本和B平级,随后A变成B的子节点)

2.         拥有相同类的两个组件将会生成相似的树形结构,拥有不同类的两个组件将会生成不同的树形结构(A和B组件结构不一致)

3.         同一层级的一组子节点,它们可以通过uuid进行区分。

DIFF算法在执行时有三个维度,分别是Tree DIFF、Component DIFF和Element DIFF,执行时按顺序依次执行,它们的差异仅仅因为DIFF粒度不同、执行先后顺序不同。

315badd9651f8d79363b01a506e8531759d40bfe

Tree DIFF是对树的每一层进行遍历,如果某组件不存在了,则会直接销毁。如图所示,左边是旧属,右边是新属,第一层是R组件,一模一样,不会发生变化;第二层进入Component DIFF,同一类型组件继续比较下去,发现A组件没有,所以直接删掉A、B、C组件;继续第三层,重新创建A、B、C组件。

5fbd248ebec60d443606aa8e612047d371355a40

如图所示,第一层遍历完,进行第二层遍历时,D和G组件是不同类型的组件,不同类型组件直接进行替换,将D删掉,再将G重建。

27222d09d321b46faeadca9a82dff6164cfbac12

Element DIFF紧接着以上统一类型组件继续比较下去,常见类型就是列表。同一个列表由旧变新有三种行为,插入、移动和删除,它的比较策略是对于每一个列表指定key,先将所有列表遍历一遍,确定要新增和删除的,再确定需要移动的。如图所示,第一步将D删掉,第二步增加E,再次执行时A和B只需要移动位置即可。

 

React Fiber

7d1162dd65baaa56bf26b21d3b4b9bdf52ecdbab

React Fiber是react执行渲染时的一种新的调度策略,JavaScript是单线程的,一旦组件开始更新,主线程就一直被React控制,这个时候如果再次执行交互操作,就会卡顿。

React Fiber重构这种方式,渲染过程采用切片的方式,每执行一会儿,就歇一会儿。如果有优先级更高的任务到来以后呢,就会先去执行,降低页面发生卡顿的可能性,使得React对动画等实时性要求较高的场景体验更好。

文章部分配图来自此文章:https://zhuanlan.zhihu.com/p/20346379

本文由云栖志愿小组毛鹤整理,编辑百见

相关文章
AI训练师入行指南(三):机器学习算法和模型架构选择
从淘金到雕琢,将原始数据炼成智能珠宝!本文带您走进数字珠宝工坊,用算法工具打磨数据金砂。从基础的经典算法到精密的深度学习模型,结合电商、医疗、金融等场景实战,手把手教您选择合适工具,打造价值连城的智能应用。掌握AutoML改装套件与模型蒸馏术,让复杂问题迎刃而解。握紧算法刻刀,为数字世界雕刻文明!
38 6
React 执行过程中 Fiber 的优先级是如何确定的?
【10月更文挑战第27天】React能够更加智能地管理任务的执行顺序,在保证用户交互体验的同时,充分利用系统资源,提高应用的整体性能和响应速度。
深入理解React Fiber架构及其性能优化
【10月更文挑战第5天】深入理解React Fiber架构及其性能优化
207 1
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
29 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
架构学习:7种负载均衡算法策略
四层负载均衡包括数据链路层、网络层和应用层负载均衡。数据链路层通过修改MAC地址转发帧;网络层通过改变IP地址实现数据包转发;应用层有多种策略,如轮循、权重轮循、随机、权重随机、一致性哈希、响应速度和最少连接数均衡,确保请求合理分配到服务器,提升性能与稳定性。
489 11
架构学习:7种负载均衡算法策略
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
软演员-评论家算法(Soft Actor-Critic, SAC)是深度强化学习领域的重要进展,基于最大熵框架优化策略,在探索与利用之间实现动态平衡。SAC通过双Q网络设计和自适应温度参数,提升了训练稳定性和样本效率。本文详细解析了SAC的数学原理、网络架构及PyTorch实现,涵盖演员网络的动作采样与对数概率计算、评论家网络的Q值估计及其损失函数,并介绍了完整的SAC智能体实现流程。SAC在连续动作空间中表现出色,具有高样本效率和稳定的训练过程,适合实际应用场景。
559 7
深度强化学习中SAC算法:数学原理、网络架构及其PyTorch实现
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
334 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
婚恋交友系统平台 相亲交友平台系统 婚恋交友系统APP 婚恋系统源码 婚恋交友平台开发流程 婚恋交友系统架构设计 婚恋交友系统前端/后端开发 婚恋交友系统匹配推荐算法优化
婚恋交友系统平台通过线上互动帮助单身男女找到合适伴侣,提供用户注册、个人资料填写、匹配推荐、实时聊天、社区互动等功能。开发流程包括需求分析、技术选型、系统架构设计、功能实现、测试优化和上线运维。匹配推荐算法优化是核心,通过用户行为数据分析和机器学习提高匹配准确性。
300 3
分布式系统架构1:共识算法Paxos
本文介绍了分布式系统中实现数据一致性的重要算法——Paxos及其改进版Multi Paxos。Paxos算法由Leslie Lamport提出,旨在解决分布式环境下的共识问题,通过提案节点、决策节点和记录节点的协作,确保数据在多台机器间的一致性和可用性。Multi Paxos通过引入主节点选举机制,优化了基本Paxos的效率,减少了网络通信次数,提高了系统的性能和可靠性。文中还简要讨论了数据复制的安全性和一致性保障措施。
204 1
React 的 fiber
【10月更文挑战第26天】React Fiber 是 React 框架中的一个重要创新,它为 React 应用的性能优化和用户体验提升提供了强大的支持,使得 React 在处理复杂的前端应用场景时更加高效和灵活。
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等