虚拟DOM-Diff算法详解

假如我们想自己实现一个React,简单底层实现:

1.state数据
2.JSX 模板
3.数据 + 模板 结合,生成真实的DOM,来显示
4.state 发生改变
5.数据 + 模板 结合,生成真实的DOM,替换原始的DOM
缺陷:
第一次生成了一个完整的DOM片段
第二次生成了一个完整的DOM片段
第二次的DOM替换第一次的DOM,非常耗性能(实际上可能只有片段中的一小部分需要改变)

那我们应该如何改良呢?

1.state数据
2.JSX 模板
3.数据 + 模板 结合,生成真实的DOM,来显示
4.state 发生改变
5.数据 + 模板 结合,生成真实的DOM,并不直接替换原始的DOM
6.新的DOM和原始的DOM做对比,找差异
7.找出发生了变化的地方
8.只用新的DOM中变化的地方,来替换掉老的DOM中的对应位置
缺陷:
性能的提升并不明显

React提出了第三种方案——虚拟DOM

1.state 数据
2.JSX 模板
3.数据 + 模板结合,生成虚拟DOM(虚拟DOM就是一个JS对象,用它来描述真实DOM)
[ 'div', {id: 'abc'}, [ 'span', {}, 'hello world' ] ]
3.用虚拟DOM的结构生成真实的DOM,来显示
<div id='abc'><span>hello world</span></div>
5.state 发生变化
6.数据 + 模板 生成新的虚拟DOM(极大的提升了性能)
[ 'div', {id: 'abc'}, [ 'span', {}, 'bye bye' ] ]

  1. 比较原始虚拟DOM和新的虚拟DOM的区别,找到区别是span中的内容(极大的提升了性能)
    8.直接操作DOM,改变span中的内容
React的JSX解析过程

JSX -> createElement -> 虚拟DOM(JS对象)->真实的DOM
例如:
return <div><span>item</span></div>
等同于
return React.createElement('div',{},React.createElement('span',{},item));

虚拟DOM带来了什么好处

1.性能提升了
2.它使得跨端应用得以实现(React Native),因为虚拟DOM在原生应用和网页中都能够被识别。

Diff算法

同层比对,如果一层不同,则直接替换,不会做下一层的比对,这样性能比较好

setState是异步的

是为了提升底层的性能。假设我连续调用三次setState,变更三组数据,由于setState是异步的,React可以把三次setState合并成一次,只去做一次虚拟DOM的比对,就可以省去两次虚拟DOM的比对带来的性能的耗费。

key值能用index吗?

react中,我们能不用indexkey值就尽量不用indexkey值,因为这样是不稳定的,我们应该尽量用稳定的不会改变的key值。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 导读: 当用原生 JS / jQuery 操作 DOM 时,浏览器会从构建 DOM 树开始从头到尾渲染一遍 DOM...
    饮杯梦回酒阅读 2,024评论 3 12
  • 项目demo: https://github.com/Aluka-w/ReactBase React学习 项目开始...
    我的钱包瘪瘪的阅读 1,562评论 0 1
  • 3. JSX JSX是对JavaScript语言的一个扩展语法, 用于生产React“元素”,建议在描述UI的时候...
    pixels阅读 2,961评论 0 24
  • 数据驱动原理 假如让我们自己实现react中数据驱动视图,我们该怎么做呢? 一般人想到的做法是:state 数据J...
    Adoins阅读 2,151评论 0 7
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,378评论 2 21

友情链接更多精彩内容