首页 > 其他分享 >虚拟DOM与DOM diff

虚拟DOM与DOM diff

时间:2024-06-18 21:32:46浏览次数:23  
标签:... span DOM React 虚拟 diff

虚拟DOM

什么是虚拟DOM

一个能代表DOM树的对象,通常含有标签名、标签上的属性、事件监听和子元素们,以及其它属性。

有关DOM的谣言

DOM操作慢,而虚拟DOM快?

这句话无异于说刘翔比姚明矮。DOM操作慢是相对于JS原生API,如数组操作。任何基于DOM的库(Vue/React)都不可能在操作DOM时比DOM快。但有些情况下虚拟DOM确实比真是DOM快。即【虚拟DOM优点】。
在一定规模操作下,虚拟DOM更快;而超出一定体量后,原生DOM操作更快。

虚拟DOM优点

1. 减少DOM操作

虚拟DOM可以将多次操作合并成一次操作【减少次数】。 如要给页面添加1000个节点,DOM操作只能逐个添加;而虚拟DOM(react)将1000个文本一次性添加到页面
虚拟DOM借助DOM diff将多余的操作省掉【减少范围】。 如现在有990个节点,要添加到1000个,只有10个是新增的,只需要更新这10个而不是全部更新

2. 跨平台

虚拟DOM不仅可以变成DOM,还可以变成小程序、IOS、安卓应用,因为虚拟DOM本质是一个JS对象

虚拟DOM示例

const vNode = {
	key: null,
	props: {
		children: [	// 子元素
			{ type: 'span', ...},
			{ type: 'span', ...}
		],
		calssName: "red",
		omClick: ()=>{}	// 事件
	},
	ref: null,
	type: "div",	// 标签名 or 组件名
	...
}
const vNode = {
	tag: "div",		// 标签上的属性
	on: {
		click: ()=<>{} 	// 事件
	},
	children: [	// 子元素
		{ tag: 'span', ...},
		{ tag: 'span', ...}
	]
}

创建虚拟DOM

React.createElement

creatElement('div', {className: 'red', onClick: ()=>{}}, [
		createElement('span', {}, 'span1'),     // 标签,事件,内容
		createElement('span', {}, 'span2'),
	]
)

h【只能在render函数里得到h】

h('div', {
	class: 'red',
	on: {
		click: ()=<>{}
	},
}, [h('span', {}, 'span1), h('span', {}, 'span2'])

上面的写法是不是看起来和DOM操作一样繁琐?试试下面这种吧

用JSX简化创建虚拟DOM

React JSX:通过babel转为createElement形式

<div className:="red" onClick="{()=>{}}">
		<span>span1</span>
		<span>span2</span>
</div>

Vue Template:通过vue-loader转为h形式

<div class="red" @click="()=>{}">
	<span>span1</span>
	<span>span2</span>
</div>

DOM diff

什么是DOM diff

就是一个函数,我们称之为patch
patch= patch(oldVNode, newVNode)
patches就是要运行的DOM操作,可能长这样:

[
	{type:'INSERT', vNode:...},    // ...表示插入的位置
	{type:'TEXT', vNode:...},
	{type:'PROPS', propsPatch:[...]},
]

DOM diff可能的逻辑

Tree diff

把虚拟DOM想象成树。将新旧两棵树逐层对比,找出哪些节点需要更新
如果节点是组件就看Component diff
如果节点是元素就看Element diff
在这里插入图片描述

Component diff

如果节点是组件,就先看组件类型
类型不同直接替换(删除旧的)
类型相同只更新属性
然后深入组件做Tree diff(递归)

Element diff

如果节点是原生标签,则看标签名
标签名不同直接替换,相同只更新属性
然后进入标签后代做Tree diff.(递归)

DOM diff缺点

同级节点对比存在bug:DOM diff 中的 key 问题
这个问题在 React 中也存在

关于DOM diff的更多博客

React入门学习(四)-- diffing 算法
React 虚拟 Dom 和 diff 算法
React 源码剖析系列 - 不可思议的 react diff

标签:...,span,DOM,React,虚拟,diff
From: https://blog.csdn.net/m0_60934382/article/details/139706579

相关文章

  • Stable Diffusion 3 大模型文生图“开源英雄”笔记本部署和使用教程,轻松实现AI绘图自
    备受期待的StableDiffusion3(以下亦简称SD3)如期向公众开源了(StableDiffusion3Medium),作为StabilityAI迄今为止最先进的文本生成图像的开源大模型,SD3在图像质量、文本内容生成、复杂提示理解和资源效率方面有了显著提升,被誉为AI文生图领域的开源英雄。StableDiffusion......
  • Stable Diffusion 3 大模型文生图“开源英雄”笔记本部署和使用教程,轻松实现AI绘图自
    备受期待的StableDiffusion3(以下亦简称SD3)如期向公众开源了(StableDiffusion3Medium),作为StabilityAI迄今为止最先进的文本生成图像的开源大模型,SD3在图像质量、文本内容生成、复杂提示理解和资源效率方面有了显著提升,被誉为AI文生图领域的开源英雄。StableDiffusion3Medi......
  • 深入理解Java虚拟机
    类加载加载java数据类型分为基本数据类型和引用数据类型,基本数据类型由虚拟机预先定义,引用数据类型才需要类的加载过程。类的加载,就是将java类的字节码文件加载到内存中,并通过字节码在内存中构建出类的原型---类模板对象。jvm把字节码中的常量池,类字段,类方法等信息存储到类模......
  • Linux 虚拟网络 IPIP
    IPIPIPIP隧道是一种点对点的隧道协议,用于在IPv4网络上传输IPv4或IPv6数据包。IPIP隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包中,新的IP数据包的目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原始IP数据包,并将其传递到目标主机。IPIP隧道可以在不同的......
  • [论文阅读] BBDM@ Image-to-Image Translation With Brownian Bridge Diffusion Model
    Pretitle:BBDM:Image-to-ImageTranslationWithBrownianBridgeDiffusionModelssource:CVPR2023paper:https://arxiv.org/abs/2205.07680code:https://github.com/xuekt98/BBDM关键词:I2I,BrownianBridge,Diffusion阅读理由:挺新奇的MotivationGAN-based......
  • JQuery基础28_DOM操作3
    一、属性内容操作1、html():获取/设置元素的标签体内容 <a><font>内容</font></a>--><font>内容</font>2、text():获取/设置元素的标签体纯文本内容<a><font>内容</font></a>-->内容3、val():获取/设置元素的value属性值<!DOCTYPEhtml>......
  • Linux 虚拟网络 VXLAN
    VXLANVXLAN本质上是一种隧道技术,在源网络设备与目的网络设备之间的IP网络上,建立一条逻辑隧道,将用户侧报文经过特定的封装后通过这条隧道转发VXLAN已经成为当前构建数据中心的主流技术,是因为它能很好地满足数据中心里虚拟机动态迁移和多租户等需求。一、使用Containerlab模......
  • AI绘画-Stable Diffusion三次元人物模型训练(炼丹)教程,你也可以定制你的三上youya老师!
    大家好,我是设计师阿威(Stablediffusion生成的三上youya老师)用AI进行画出不同人物,我们需要训练自己Lora模型。除了训练二次元人物之外,也常常要训练三次元人物。比如福利姬老师可以训练自己然后穿上各种美美的衣服来拍照,减少自己的日常工作量。我们也可以训练模特人物之......
  • AI绘画Stable Diffusion 挽救渣图的神器—Loopback Scaler脚本,你值得拥有!
    大家好,我是向阳今天这篇文章就是围绕着开局的这两张原图开始的。在Stablediffusion甚至当前所有的AI画图工具里面,AI生成内容随机性都是一个很大的问题。我们经常遇到一张图构图不错但是脸崩了,又或者人物形象不错但是背景画得崩了这样的问题。前者我们往往把图扔到图生......
  • 【Stable Diffusion教程】AI绘画工具SD如何安装使用?三种方法带你轻松上手!(附安装包和云
    大家好,我是向阳AI绘画专业工具StableDiffusion在哪里用怎么安装?这一期给大家介绍三种使用SD的方法,无论你有没有专业显卡都能轻松上手SD哦~一、SD本地部署秋葉安装包安装方法如果你有进一步的需求,想要学习SD的高端玩法,有高端显卡的同学们我建议本地安装部署一下SD。这里要......