浅谈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.声明 ...
随机推荐
- 如何使用CSS隐藏滚动条并且兼容大部分浏览器
隐藏滚动条,已经自己实测在浏览器Chrome, IE (6+), Firefox, Opera, Safari. 如下demo: Content 1 Content 1 Content 1 Conte ...
- 封装微信jssdk自定义分享代码
var protocol = window.location.protocol; //获取协议 var host = window.location.host; //获取域名 var posuDoma ...
- canvas-菜鸟版画布时钟
这是以前自己练习写的一个画布时钟 <!DOCTYPE html><html lang="en"> <head> <meta charset ...
- 有关在新版mac上 git 环境变量的配置问题
前段时间买的新版 mpb ,各种环境什么都没有配置,想着在网上边搜边摸索着将各种开发工具逐步配置齐全,各种问题不断出现,不知道是不是新版的原因不兼容. 其中 git 的配置尤为奇怪.在git官网上直接 ...
- 关于Visio的vba操作,遍历目录,对所有vsd文件操作,导入excel文件
1.vba遍历要添加引用,runtime 2.不能打开单独的application,因为在获取到shape的picture属性时候,新打开的application不能够获取到.提示自动化错误. 3.定 ...
- WCF 的优势和特点
版权声明:本文为博主原创文章,未经博主允许不得转载. 一.理解面向服务(Service-Oriented-Architecture) 是指为了解决在Internet环境下业务集成的需要,通过连接 ...
- 如何在PB中调用 Microsoft WEB 浏览器 控件?
PB中使用Microsoft Web Browser控件步骤: 在pb的某窗口中加入OLE对象,选择Insert control(插入控件),然后选中"Microsoft WEB 浏览器&q ...
- Selenium2学习(十五)-- 单选框和复选框(radiobox、checkbox)
本篇主要介绍单选框和复选框的操作 一.认识单选框和复选框 1.先认清楚单选框和复选框长什么样 2.各位小伙伴看清楚哦,上面的单选框是圆的:下图复选框是方的,这个是业界的标准,要是开发小伙伴把图标弄错了 ...
- python3的学习经验
网上资料非常多,颇有些“乱花渐欲迷人眼”的意味,个人看了不少,拖之前从事前端的福,发现廖雪峰大神的网站里有.学了2天之后发觉获益良多,网址:https://www.liaoxuefeng.com/wi ...
- Jquery的部分插件
jQuery Easing:jQuery 动画效果扩展 jQuery Migrate:jQuery 应用迁移辅助插件Modernizr:专为HTML5和CSS3开发的功能检测类库jQuery Flex ...