为什么要使用虚拟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的更多相关文章

  1. 浅谈React

    浅谈react react是什么?其官网给出了明确定义:A JavaScript library for building user interfaces,一个用于构建用户界面的JavaScript库 ...

  2. 【转】浅谈React、Flux 与 Redux

    本文转自<浅谈React.Flux 与 Redux>,转载请注明出处. React React 是一个 View 层的框架,用来渲染视图,它主要做几件事情: 组件化 利用 props 形成 ...

  3. 浅谈React工作原理

    浅谈React工作原理:https://www.cnblogs.com/yikuu/p/9660932.html 转自:https://cloud.tencent.com/info/63f656e0b ...

  4. React虚拟DOM浅析

    在Web开发中,需要将数据的变化实时反映到UI上,这时就需要对DOM进行操作,但是复杂或频繁的DOM操作通常是性能瓶颈产生的原因,为此,React引入了虚拟DOM(Virtual DOM)的机制. 什 ...

  5. React虚拟DOM具体实现——利用节点json描述还原dom结构

    前两天,帮朋友解决一个问题: ajax请求得到的数据,是一个对象数组,每个对象中,具有三个属性,parentId,id,name,然后根据这个数据生成对应的结构. 刚好最近在看React,并且了解到其 ...

  6. react虚拟dom diff算法

    react虚拟dom:依据diff算法 前端:更新状态.更新视图:所以前端页面的性能问题主要是由Dom操作引起的,解放Dom操作复杂性 刻不容缓 因为:Dom渲染慢,而JS解析编译相对非常非常非常快! ...

  7. 浅谈React数据流管理

    引言:为什么数据流管理如此重要?react的核心思想就是:UI=render(data),data就是我们说的数据流,render是react提供的纯函数,所以用户界面的展示完全取决于数据层.这篇文章 ...

  8. React 虚拟 DOM 的差异检测机制

    React 使用虚拟 DOM 将计算好之后的更新发送到真实的 DOM 树上,减少了频繁操作真实 DOM 的时间消耗,但将成本转移到了 JavaScript 中,因为要计算新旧 DOM 树的差异嘛.所以 ...

  9. 浅谈 React

    机缘巧合认识React,翻了2天的资料,又整理了1天,也算是简单入门了;之前也学过angular,相比来说,的确React代码逻辑更加简单明了,理解起来也相对容易. React 具备以下特性:1.声明 ...

随机推荐

  1. js CheckBox 全选、反选

    <h3>你最喜欢的水果是?</h3> <label><input type="checkbox"/>苹果</label> ...

  2. vim右键粘贴 等杂

    putty连上linux,vim编辑个文件,我去,右键不能用用上下面的命令,就好了. set mouse-=a 今天发现mysql倒入utf-8的文件网站显示出来都是乱码,不过用utf-8的控制台看是 ...

  3. Cass和ArcGIS交换

    南方cass图形为CAD,把CAD图形转换成arcgis没有任何问题,到属性有问题,cass存放数据是放在CAD扩展XDATA中,和 arcgis导入导出CAD标准扩展属性不一样,只能二次开发使用,c ...

  4. 02_ActiveMQ入门

    [ActiveMQ 入门HelloWorld例子] [启动ActiveMQ] 1.由于本人PC是64位的,选择在bin目录下的win64/activemq.bat启动. 2.启动成功后,访问http: ...

  5. ng-repeat和ng-options区别

    ng-repeat ="x in XXX" ng-options="x.*** for x in XXX“ ng-repeat 写法 <select> < ...

  6. 免费的SSL证书,你值得拥有!Let's Encrypt 试用体验记录

    早上收到 Let’s Encrypt 的邮件,说偶之前申请的已经通过了,于是马上开始试用.Let’s Encrypt 是一个新的数字证书认证机构,它通过自动化的过程消除创建和安装证书的复杂性,为网站提 ...

  7. 关于git的认识与想法

    1.什么是git:                Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git的读音为/gɪt/.               Git是一个 ...

  8. Scrum _GoodJob

    作为长大的大三老腊肉,我们已经在长大生活了两年多,对于什么是长大人最想完善的校园需求.最想拥有的校园服务媒介也有了更加深切的体会. 于是,GoodJob小团队blingbling闪现啦!! GoodJ ...

  9. { ($0, Resolver($0.box)) }(Promise<T>(.pending)):闭包的定义与执行合一

    public class func pending() -> (promise: Promise<T>, resolver: Resolver<T>) { return ...

  10. SpringMVC学习记录六——异常定义和上传图片

    19       异常处理 19.1      异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试 ...