React diff策略

React dom过程

不可变数据,Immutable 是在 数据结构参数变化 到 虚拟dom对象的阶段。

diff算法是在 旧的虚拟dom 到 新的虚拟dom的阶段。

从数据结构 -> 虚拟对象 -> 到虚拟dom树 -> 新的虚拟dom -> 渲染成真实dom -> 挂载

相比于一版树形结构对比,算法复杂度可以从(o(n^3))降低到 (o(n))。

树形dom树结构如果有1000子节点,一般diff算法,会比较1000^3次,浪费资源。

diff策略提供了逐步提升渲染dom节点的性能,主要有 3 个策略

React diff 算法

将虚拟dom转换成真实dom的过程,称为调和,调和的具体实现就是 diff策略。

主要有 3类 diff算法,可以将复杂度 o(n^3) 转换为 o(n) 。

tree diff

(1), updateDepth对Virtual DOM树进行层级控制

(2), 同层比较,如果节点不存在,该节点及其子节点都会被删除

(3), 只需遍历一次,就能完成整棵dom树的比较

(4), 如果是跨层级,只有新建节点和删除节点的操作,推荐尽量不要跨层级,跨层级可用css display: none等手段完成。

component diff

(1),  同类型的两个组件,比较Virtual DOM树

(2), 若两次组件未发生变化可以通过  shouldComponentUpdate 做判断

(3), 不同类型的组件,会被判定作为脏组件处理,直接删除。或创建新组建

element diff

(1),判断旧的和新的组件集合,如果有组件变更,需要重新创建

(2),同组被子节点添加 唯一的key 进行组件区分,主要操作: 移动,插入,删除

重点说下移动

(1),新旧节点会对比下标,新的下标称为lastIndex,旧的称为index,如果lastIndex大于index,需要将节点旧的节点移动到新的位置,相反则不动。

(2),如果没有找到对应位置节点,新增; 如果旧的节点在新的节点组用不到,则删除;一般是在最后做删除操作。

(3),特殊情形,最后一个节点移动到第一个位置,会导致,前面的n-1个节点的lastIndex都比较大,然后都后移,形象性能。尽量避免这样的操作。

原文地址:https://www.cnblogs.com/the-last/p/11442366.html

时间: 2024-10-09 03:23:44

React diff策略的相关文章

react Diff算法

一个页面就是一个DOM树,当页面发生变化的时候,又会形成另一个DOM树,这两个树要作比较的时候,就用到了Diff算法. 传统的diff算法为O(n^3),相当复杂. 时间复杂度是检测一个算法或者一个性能好坏的重要因数. 其他它没有什么神奇的,只是一个名词而已. O(n^3)  ->  O(n^2)  ->   O(n) 从左到右,时间复杂度越来越小,越小性能越好. 传统的diff算法会比较不同,react的diff算法会先检查结构是否相同,如果不同直接销毁重建. react将diff算法从O(

react diff算法剖析总结

原文:https://zhuanlan.zhihu.com/p/20346379 总结一下个人看完之后的理解: 1.tree diff:只对相同层级的节点进行比较,如果子树在新树种不存在了,则直接删除.如果新加了树就是创建,那么如果进行了跨层级的树的移动怎么办?答案是直接删除移动前的树,在移动后的位置创建一颗一模一样的. 所以在react中尽量还是不要进行跨层级的移动. 2.component diff:如果是相同的组件,则继续比较virtual DOM tree.如果不是,则直接删除整个组件并

React 虚拟dom与diff算法

一.React的虚拟dom react生成真实dom的步骤如下: 1.state(数据)与模版结合生成虚拟dom. 2.React根据虚拟dom的结构生成真实dom节点(1). 3.数据发生改变时,生成新的虚拟dom. 4.新的虚拟dom与原先的虚拟dom进行比较,将新的虚拟dom变动的部分替换原虚拟dom.(2) 5.根据变动后的虚拟dom结构生成真实的dom. 注解:(1)React根据虚拟dom生成真实dom,而不是直接生成真实dom.根据这个特性,可以实现跨端应用(React Nativ

react总结(二)

写这个总结的想法主要是来源于我的一个同事,他资历比较深,突然问我最近有没有在学习什么框架,我说在学react,他问我,为什么要学习react,然后我说了几点react的好处,其中一点是:react的虚拟DOM,不需要操作真实的DOM,从而减少性能消耗.然后他问了我一个很有意思的问题,当两个很复杂的DOM树,相互比较的时候,也很消费时间的,问我react是怎么去减少这个时间的消耗呢?然后我也很奇怪,我能想到的就是通过深度遍历或者广度遍历来获取每一个子节点,然后进行比较,但是这样操作的复杂度很高,性

ReactiveNative学习之Diff算法

React 源码剖析系列 - 不可思议的 react diff深入浅出React(四):虚拟DOM Diff算法解析React diff 算法总结链接引用的文章React出于性能的考虑,为了避免频繁操作DOM,采用了虚拟DOM结构(virtual DOM):每当虚拟DOM树发生变化树发生变化时,React会将当前DOM树和之前的虚拟DOM树进行diff算法对比,得到虚拟DOM结构的区别,然后仅仅渲染差异部分.ReactiveNative官方称,不同类型的 component 是很少存在相似 DO

重谈react优势——react技术栈回顾

react刚刚推出的时候,讲react优势搜索结果是几十页. 现在,react已经慢慢退火,该用用react技术栈的已经使用上,填过多少坑,加过多少班,血泪控诉也不下千文. 今天,再谈一遍react优势,WTF? React的收益有哪些?React的优势是什么?react和vue.angularJS等其它框架对比优势? 而作为总结回顾.react在工程实践中,带来哪些思想上的质变? virtual dom虚拟DOM概念 它并不直接对DOM进行操作,引入了一个叫做virtual dom的概念,安插

react学习笔记-06

1.在调用setState之后发生了什么? 在代码调用setState之后,React会将传入的参数对象与组件当前状态合并,然后触发调和过程.在调和过程中,react会以相对搞高效的方式根据新的状态构建DOM树,在构建DOM的时候,react会比较新的DOM树和老的DON树的节点差异,然后根据差异对界面进行最小化重渲染.在Diff 算法中,React能够精确的知道哪些位置发生了改变以及该如何改变,这就保证了按需更新,而不是全部更新. 2.React中element与compoent的区别 Rea

react的非DOM操作

非dom属性?dangerouslySetInnerHTML,ref,key非dom标准属性,也就是说dom标准里面没有规定的属性,react引入了三个非dom属性,如上. dangerouslySetInnerHTML:字面意思,危险的设置内部html,这个属性的作用就是在jsx中,直接插入html代码.我们为什么用这个属性插入html代码呢?而不是在编写代码的时候直接写入呢?因为有的时候我们在编写代码的时候,无法确实要插入什么代码,也就是说这部分html代码是动态生成的.或者说不是由我们来编

react 的虚拟dom

js.jsx文件引入react:import React,{Component} from 'react' js.jsx文件引入css:impot './One.css' import React, {Component} from 'react'//js.jsx文件引入react import './One.css' //js.jsx文件引入css: class One extends Component{ render(){ console.log('one render'); return