React中的虚拟DOM&Diff算法

虚拟DOM

概念

虚拟DOM其实就是一个JS对象,用它来描述真实的DOM

如何重新渲染页面

数据发生变化,如:

<div id='root'>
    <span>hello world</span>
</div>

变为:

<div id='root'>
    <span>hello Amethsyt~</span>
</div>

步骤:

  1. state数据
  2. JSX模板
  3. 数据+模板,生成虚拟DOM(损耗性能)
['div',{id:'root'},['span',{},'hello world']]
  1. 用虚拟DOM的结构生成真实的DOM,显示在页面上
<div id='root'><span>hello world</span></div>
  1. state发生变化
  2. 数据+模板 生成新的虚拟DOM (极大地提升了性能)
['div',{id:'root'},['span',{},'hello Amethsyt~']]
  1. 比较原始虚拟DOM和新的虚拟DOM的区别,找到区别是span的内容(极大地提升性能)

直接操作DOM会比较损耗性能,而操作JS对象对性能的消耗是极小的,因此性能得到极大地提升

react底层会把JSX语法通过createElement方法将一个js对象转换成虚拟DOM,再渲染成真实的DOM

JSX——>createElement——>虚拟DOM(JS对象)——>真实的DOM

在这里插入图片描述

优点

1、性能提升了
2、使得跨端应用得以实现。React Native

用react语法写原生的应用得益于虚拟DOM的存在,在移动端的原生应用里面,是没有DOM概念的,如果没有虚拟DOM,应用就只能运行在浏览器上,有了虚拟DOM之后,我们的代码首先被转换成虚拟DOM(JS对象),JS对象在浏览器、原生的应用里面都可以被识别,虚拟DOM在浏览器上可以转换成真实的DOM,在原生应用里可以生成原生组件,这使得react既可以开发网页应用,也可以开发原生应用。

虚拟DOM中的Diff算法

state发生改变的时候需要生成新的虚拟DOM,此时便需要比对数据,Diff算法就是为了比对新的虚拟DOM和原来的虚拟DOM之间的差异。此外,react将setState设计成一个异步函数,可以把多次setState结合成一次setState,减少比对的速度,提高性能。

Diff算法特点

同层比对,逐层比对,一旦遇到一层不满足条件,将不再进行比对,剩下的直接用新的替换旧的。算法简单,比对速度快。
在这里插入图片描述

key值的引入

在这里插入图片描述

react在做列表循环的时候在循环里的最外层标签上加一个key属性,结点在原始DOM树上和新的DOM树上key值一致,提高虚拟DOM比对的性能。为了使key值保持稳定,我们一般不使用循环变量index作为key值,而是用item.
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值