首页 > 其他分享 >什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

什么是虚拟DOM?如何实现一个虚拟DOM?说说你的思路

时间:2024-10-12 18:21:42浏览次数:8  
标签:DOM void VNode 虚拟 操作 思路 节点

一、什么是虚拟DOM

虚拟 DOM (Virtual DOM )这个概念相信大家都不陌生,从 ReactVue ,虚拟 DOM 为这两个框架都带来了跨平台的能力(React-NativeWeex

实际上它只是一层对真实DOM的抽象,以JavaScript 对象 (VNode 节点) 作为基础的树,用对象的属性来描述节点,最终可以通过一系列操作使这棵树映射到真实环境上

Javascript对象中,虚拟DOM 表现为一个 Object 对象。并且最少包含标签名 (tag)、属性 (attrs) 和子元素对象 (children) 三个属性,不同框架对这三个属性的名命可能会有差别

创建虚拟DOM就是为了更好将虚拟的节点渲染到页面视图中,所以虚拟DOM对象的节点与真实DOM的属性一一照应

vue中同样使用到了虚拟DOM技术

定义真实DOM

<div id="app">
    <p class="p">节点内容</p>
    <h3>{
  { foo }}</h3>
</div>

实例化vue

const app = new Vue({
   
    el:"#app",
    data:{
   
        foo:"foo"
    }
})

观察renderrender,我们能得到虚拟DOM

(function anonymous(
) {
   
	with(this){
   return _c('div',{
   attrs:{
   "id":"app"}},[_c('p',{
   staticClass:"p"},
					  [_v("节点内容")]),_v(" "),_c('h3',[_v(_s(foo))])])}})

通过VNodevue可以对这颗抽象树进行创建节点,删除节点以及修改节点的操作, 经过diff算法得出一些需要修改的最小单位,再更新视图,减少了dom操作,提高了性能

二、为什么需要虚拟DOM

DOM是很慢的,其元素非常庞大,页面的性能问题,大部分都是由DOM操作引起的

真实的DOM节点,哪怕一个最简单的div也包含着很多属性,可以打印出来直观感受一下:

由此可见,操作DOM的代价仍旧是昂贵的,频繁操作还是会出现页面卡顿,影响用户的体验

举个例子:

你用传统的原生apijQuery去操作DOM时,浏览器会从构建DOM树开始从头到尾执行一遍流程

当你在一次操作时,需要更新10个DOM节点,浏览器没这么智能,收到第一个更新DOM请求后,并不知道后续还有9次更新操作,因此会马上执行流程,最终执行10次流程

而通过VNode,同样更新10个DOM节点,虚拟DOM不会立即操作DOM,而是将这10次更新的diff内容保存到本地的一个js对象中,最终将这个js对象一次性attachDOM树上,避免大量的无谓计算

很多人认为虚拟 DOM 最大的优势是 diff 算法,减少 JavaScript 操作真实 DOM 的带来的性能消耗。虽然这一个虚拟 DOM 带来的一个优势,但并不是全部。虚拟 DOM 最大的优势在于抽象了原本的渲染过程,实现了跨平台的能力,而不仅仅局限于浏览器的 DOM,可以是安卓和 IOS 的原生组件,可以是近期很火热的小程序,也可以是各种GUI

三、如何实现虚拟DOM

首先可以看看vueVNode的结构

源码位置:src/core/vdom/vnode.js

export default class VNode {
   
  tag: string | void;
  data: VNodeData | void;
  children: ?Array<VNode>;
  text: string | void;
  elm: Node | void;
  ns: string | void;
  context: Component | void; // rendered in this component's scope
  functionalContext: Component | void; // only for functional component root nodes
  key: string | number | void;
  componentOptions: VNodeComponentOptions | void;
  componentInstance: Component |

标签:DOM,void,VNode,虚拟,操作,思路,节点
From: https://blog.csdn.net/jiadsadfasfs/article/details/142849312

相关文章

  • 【设备漏洞】挖掘思路
    1.信息收集1.1弱口令搜索1.2硬编码问题2.相同组件及OEM框架挖掘2.1组件漏洞问题2.2OEM漏洞问题免责声明本文仅用于技术讨论与学习,利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。文章来源:先知......
  • 地平线双目深度估计参考算法 StereoNetPlus优化 思路解读
    【参考算法】地平线双目深度估计参考算法StereoNetPlus-v1.2.11.引言本文将介绍地平线基于公版的双目深度估计算法StereoNet做的优化设计。首先介绍了双目深度估计的原理以及双目点云和Lidar点云的对比,然后由公版StereoNet的介绍切入到地平线参考算法的针对性优化,最后对......
  • Virtualbox 《虚拟机空间整理》
    不会删除空间virtualbox中新建的虚拟机随着时间推移,占用物理存储越来越大,并且在动态分配硬盘的过程中,不会因为删除虚拟机上的文件,vdi的大小会随之变化1.虚拟机是Linux环境压缩空间#虚拟机环境下执行(root)ddif=/dev/zeroof=/freerm-rf/free2.虚拟机是window环境h......
  • 【反转链表】【K个一组翻转链表】两个问题具体思路,文中含多种解法(附完整代码)
    文章目录前言一、如何理解反转链表?二、反转链表1.方法一(递归)方法二(迭代)三、K个一组翻转链表前言本文将围绕【反转链表】问题展开详细论述。采用【递归法】【迭代法】同时,还将进一步升级该问题,讨论【K个一组翻转链表】一、如何理解反转链表?题目链接:[点击......
  • 虚拟化溢出漏洞的安全测试
    使用源码编译方式通过安全测试对VMwareWorkstation进行缓冲区溢出与远程代码执行(RCE)测试的完整流程注意:VMwareWorkstation是一款商业软件,其源代码为闭源状态。未经授权进行逆向工程、漏洞挖掘或任何形式的安全测试可能违反相关法律法规和软件许可协议。以下内容仅供学......
  • R语言使用randomForest包中的randomForest函数构建随机森林模型、使用importance函数
    R语言使用randomForest包中的randomForest函数构建随机森林模型、使用importance函数查看特征重要度、使用table函数计算混淆矩阵评估分类模型性能、包外错误估计OOB(out-of-bagerrorestimate)目录R语言使用randomForest包中的randomForest函数构建随机森林模型(Randomfores......
  • jupyter notebook里添加conda虚拟环境
    情况描述有时clone的项目中包含demo.ipynb文件,需要启动jupyter-notebook运行,此文记录将虚拟环境导入到jupyter中。1.下载并运行jupyter-notebook#在base环境当中安装jupyterpipinstalljupyter#base环境下运行jupyterjupyternotebook#jupyternotebook可选参数2.......
  • JVM系列1:深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因
    JVM系列1:深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因前言JVM系列文章如无特殊说明,一些特性均是基于HotSpot虚拟机和JDK1.8版本讲述。下面这张图我想对于每个学习Java的人来说再熟悉不过了,这就是整个JDK的关系图: 从上图我们可以看到,JavaVirtualMachine位于最底......
  • 虚拟环境安装(真的太容易忘记了,写一遍加深一下)
    plan1(conda安装)新建:condacreate-nnamepython=3.9checkcondaenvlistactivatecondaactivatenamebackcondadeactivateplan2(pip安装,python自带)new新建文件夹--进入文件夹--输入cmdbashpython-mvenvvenv第二个venv为nameactivatepycha......
  • 利用FnOS搭建虚拟云桌面,并搭建前端开发环境(一)
    利用FnOS搭建虚拟云桌面,并搭建前端开发环境一飞牛FnOS官方文档一、安装FnOS【Win11系统】1.下载VirtualBox2.下载FnOS镜像3.创建虚拟机4.启动完成后,会进入这样一个界面,这个基本上后续就后台了本人在网上冲浪了很久,一直也没有找到一个合适的云桌面,至于各种案例和一......