浅谈React虚拟DOM
为什么要使用虚拟DOM
因为浏览器的DOM渲染是非常消耗性能的,很低效,我们使用虚拟DOM是为了提高DOM的渲染性能;
什么是虚拟DOM
虚拟DOM就是把真实的DOM树通过createElement转换成js中的一个对象树,在内
存中作比较
在虚拟DOM中是如何渲染页面的
虚拟DOM一旦创建以后,就会根据组件内部的状态,父组件props传过来的修改,以及一些全局状态的更新,就会导致当前
组件产生一个新的js对象树,然后就会在内存中通过一个diff比较算法来比较当前的虚拟DOM节点和之前的虚拟DOM节点,将比较
的结果在DOM树上重新渲染
Diff算法(逐层比较)
Diff算法也叫同级比较算法,是逐层比较的,一旦发现某个节点没了,就删除,发现新增了一个节点,那就新增一个节点,发现
该位置该存在,就原地保留该节点。但是标准的Diff算法复杂度需要O的三次方,这样的算法显示是无法满足性能要求的,所以
势必要对该算法进行简化的。这看上去非常有难度,然而Facebook工程师却做到了,他们结合Web界面的特点做出了两个简单的
假设,使得Diff算法复杂度直接降低到O(n)复杂度从O的三次方变为了O的一次方;同时也解决了两个问题:如果两棵树比较变化
特别大,就完蛋了,如果兄弟节点进行排序和插入新节点,那还是完蛋,你要全删了再一个一个加;
接下来就要说这两个假设
(1)两个相同组件产生类似的DOM结构,不同的组件产生不同的DOM结构;
(2)对于同一层次的一组子节点,它们可以通过唯一的id进行区分。
关于第一个假设
-其实看起来并不奇怪,在我们的react中,由于组件化的思想,相同组件中本就是类似的DOM解构,只有不同的组件才会产生不
同的DOM结构,根据React官方博客,这一假设至今为止没有导致严重的性能问题。
-这当然也给我们一个提示,在实现自己的组件时,保持稳定的DOM结构会有助于性能的提升。例如,我们有时候可以通过CSS隐
藏或显示某些节点,而不是真正的去移除或添加DOM节点;
关于第二个假设,也就是我们为什么循环的时候会加上一个key值的解释
-你想,我们兄弟节点如果进行排序的时候,每个位置的节点都变了,那我们就要把每个位置的节点都重新删除掉,然后再一个
一个的重新添加上去,这样的话更新过程会特别的低效,所以第二个假设的作用就是让我们开发者在开发过程中给每个节点加上
一个:key值,也就是给每个节点加上一个唯一标识,这样就会根据列表节点提供唯一的key属性可以帮助React定位到正确的节点
进行比较,从而大幅减少DOM操作次数,提高了性能。
还有一个就是我们给节点加标识的时候,尽量不要使用下标index
-如果你用下标,你要插入一个节点,那下标不就全乱了,但是我们也可以:key=""index"",将下标转换成字符串就行,但是我
们不提倡使用index作为key的,因为我们会用用数据库返回来的id作为key值。
浅谈React虚拟DOM的更多相关文章
- 浅谈React
浅谈react react是什么?其官网给出了明确定义:A JavaScript library for building user interfaces,一个用于构建用户界面的JavaScript库 ...
- 【转】浅谈React、Flux 与 Redux
本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成 ...
- 浅谈React工作原理
浅谈React工作原理:https://www.cnblogs.com/yikuu/p/9660932.html 转自:https://cloud.tencent.com/info/63f656e0b ...
- React虚拟DOM浅析
在Web开发中,需要将数据的变化实时反映到UI上,这时就需要对DOM进行操作,但是复杂或频繁的DOM操作通常是性能瓶颈产生的原因,为此,React引入了虚拟DOM(Virtual DOM)的机制. 什 ...
- React虚拟DOM具体实现——利用节点json描述还原dom结构
前两天,帮朋友解决一个问题: ajax请求得到的数据,是一个对象数组,每个对象中,具有三个属性,parentId,id,name,然后根据这个数据生成对应的结构. 刚好最近在看React,并且了解到其 ...
- react虚拟dom diff算法
react虚拟dom:依据diff算法 前端:更新状态.更新视图:所以前端页面的性能问题主要是由Dom操作引起的,解放Dom操作复杂性 刻不容缓 因为:Dom渲染慢,而JS解析编译相对非常非常非常快! ...
- 浅谈React数据流管理
引言:为什么数据流管理如此重要?react的核心思想就是:UI=render(data),data就是我们说的数据流,render是react提供的纯函数,所以用户界面的展示完全取决于数据层.这篇文章 ...
- React 虚拟 DOM 的差异检测机制
React 使用虚拟 DOM 将计算好之后的更新发送到真实的 DOM 树上,减少了频繁操作真实 DOM 的时间消耗,但将成本转移到了 JavaScript 中,因为要计算新旧 DOM 树的差异嘛.所以 ...
- 浅谈 React
机缘巧合认识React,翻了2天的资料,又整理了1天,也算是简单入门了;之前也学过angular,相比来说,的确React代码逻辑更加简单明了,理解起来也相对容易. React 具备以下特性:1.声明 ...
随机推荐
- Number()转换规则
转换规则: Number(): 1)如果是Boolean值,true和false将分别转换为1和0. 2)如果是数字值,只是简单的传入和返回. 3)如果是null值,返回0. 4)如果是undefin ...
- Java设计模式—门面模式(带案例分析)
1.门面模式的定义: 门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式,其定义如下: 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.门面模式 ...
- 用户选择wordpress程序建站需要知道的一些事情 - 安全、优化速度、配置
WordPress是我们使用最多的CMS程序之一,无论是我们的个人博客,还是企业网站,甚至中小型站点,我们都可以用WP程序部署.我们看到海外网站的时候,大部分都是用的WORDPRESS程序.在我们国人 ...
- Android存储扩展学习-----应用的清除数据和清除缓存
前几天和朋友聊到了APP清除数据这块,聊到了清除数据都会清掉哪些数据,我们每个人的手机在”设置–>应用管理”里面,选择任意一个App,都会看到两个按钮,一个是清除缓存,另一个是清除数据,那么当我 ...
- mvc4站点支持.html
MVc站点在配置通配符后,还需要配置这个才能支持.html.在自定义的路由中加入.自定义代码就可以支持子定义的html了.
- 30分钟LINQ教程 【转载】
原文地址:http://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html 在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有 ...
- JS interview loop code
//九九乘法表 document.write("<table width='600' border=0'>"); for(var i=1; i<=9; i++){ ...
- apache ab 测试 apr_socket_connect(): 由于目标机器积极拒绝 无法连接
遇到这种情况一般是你开的并行数量太多了...例如:ab -c 1000 -n 10000 http://localhost/index.html 如此大的请求就会挂掉,不过还是有补救措施的,可以通过增 ...
- gluon 实现线性回归
from mxnet import autograd, nd num_inputs = 2 num_examples = 1000 true_w = [2,-3.4] true_b = 4.2 fea ...
- Uva 10559 消除方块
题意: 每次可以选择一个区间(连续相同的序列)消除,得分为 len*len:问最大得分. 分析: 很容易想到是区间DP,但是不像普通的区间DP一样切割方式~~~ 如果定义 d[ i ][ j ] 区间 ...