| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> React中的Diff算法 -> 正文阅读 |
|
[JavaScript知识库]React中的Diff算法 |
目录 一、Diff算法的作用????????渲染真实DOM的开销很大,有时候我们修改了某个数据,直接渲染到真实dom上会引起整个dom树的重绘和重排。我们希望只更新我们修改的那一小块dom,而不是整个dom,diff算法就帮我们实现了这点。 二、React的Diff算法??1、什么是调和????将Virtual DOM树转换成Actual DOM树的最少操作的过程称为调和。 2、什么是React diff算法????diff算法是调和的具体实现。 3、diff策略???React用三大策略 将O(n3)复杂度 转化为O(n)复杂度 ?????(1)策略一(tree diff):Web UI中DOM节点跨层级的移动操作特别少,可以忽略不计。 ????(2)策略二(component diff):拥有相同类的两个组件 生成相似的树形结构,拥有不同类的两个组件 生成不同的树形结构。 ????(3)策略三(element diff):对于同一层级的一组子节点,通过唯一id区分。 4、tree diff:(1)React通过updateDepth对Virtual DOM树进行层级控制。 (2)对树分层比较,两棵树只对同一层次节点进行比较。如果该节点不存在时,则该节点及其子节点会被完全删除,不会再进一步比较。 (3)只需遍历一次,就能完成整棵DOM树的比较。 如果DOM 节点出现了跨层级操作,Diff会怎么办? ? ? ? ? 答:Tree DIFF是对树的每一层进行遍历,如果某组件不存在了,则会直接销毁。如图所示,左边是旧属,右边是新属,第一层是R组件,一模一样,不会发生变化;第二层进入Component DIFF,同一类型组件继续比较下去,发现A组件没有,所以直接删掉A、B、C组件;继续第三层,重新创建A、B、C组件。 ?如上图所示,以A为根节点的整棵树会被重新创建,而不是移动,因此?官方建议不要进行DOM节点跨层级操作,可以通过CSS隐藏、显示节点,而不是真正地移除、添加DOM节点。 5、component diff :React对不同的组件间的比较,有三种策略 (1)同一类型的两个组件,按原策略(层级比较)继续比较Virtual DOM树即可。 (2)同一类型的两个组件,组件A变化为组件B时,可能Virtual DOM没有任何变化,如果知道这点(变换的过程中,Virtual DOM没有改变),可节省大量计算时间,所以用户可以通过 shouldComponentUpdate() 来判断是否需要判断计算。 (3)不同类型的组件,将一个(将被改变的)组件判断为dirtycomponent(脏组件),从而替换整个组件的所有节点。 ?注意:如上图所示,当组件D变为组件G时,即使这两个组件结构相似, 6、element diff????当节点处于同一层级时,diff提供三种节点操作:删除、插入、移动。 ???插入:组件 C 不在集合(A,B)中,需要插入 ?删除: (1)组件 D 在集合(A,B,D)中,但 D的节点已经更改,不能复用和更新,所以需要删除 旧的D ,再创建新的。 (2)组件D之前在集合(A,B,D)中,但集合变成新的集合(A,B)了,D 就需要被删除。 移动:组件D已经在集合(A,B,C,D)里了,且集合更新时,D没有发生更新,只是位置改变,如新集合(A,D,B,C),D在第二个,无须像传统diff,让旧集合的第二个B和新集合的第二个D 比较,并且删除第二个位置的B,再在第二个位置插入D,而是 (对同一层级的同组子节点) 添加唯一key进行区分,移动即可。 ?移动情形一:新旧集合中存在相同节点但位置不同时,如何移动节点 ? (1)B不移动,不赘述,更新l astIndex=1 (2)新集合取得 E,发现旧不存在,故在lastIndex=1的位置 创建E,更新lastIndex=1 (3)新集合取得C,C不移动,更新lastIndex=2 (4)新集合取得A,A移动,同上,更新lastIndex=2 (5)新集合对比后,再对旧集合遍历。判断 新集合 没有,但 旧集合 有的元素(如D,新集合没有,旧集合有),发现 D,删除D,diff操作结束。 React中Diff算法实现的代码:
三、基于Diff的开发建议基于tree diff:
基于component diff:
基于element diff:
参考文章:?diff算法_MyEee~~的博客-CSDN博客_diff算法 ? |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:53:35- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |