VNode是什么?

news2024/10/7 0:09:33

什么是VNode

VNode的全称是Virtual Node,也就是虚拟节点.它是指一个抽象的节点对象,用于描述真实DOM中的元素。在前端框架中,通过操作VNode来实现虚拟DOM,从而提高性能。

VNode的本质

本质上是JavaScript对象,这个对象就是更加轻量级的对DOM的描述

为什么需要VNode

在前端框架中,我们通常需要在页面中操作DOM元素,如增删改查等操作。但是DOM操作是非常耗费性能的,尤其是在频繁更新DOM的情况下,会导致页面卡顿,影响用户体验。为了解决这个问题,前端框架中引入了虚拟DOM(Virtual DOM)的概念。

虚拟DOM:是通过一个虚拟树来描述真实DOM树中的元素,它可以在内存中进行快速操作,并且在操作完成后,再将虚拟DOM树和真实DOM树进行比较,只将有变化的部分进行更新,从而提高性能。

VNode就是虚拟DOM中的一个节点对象,它用于描述一个真实DOM中的元素。VNode通常包含了元素的标签名、属性、子节点等信息,这些信息可以用来生成真实DOM树。

在这里插入图片描述

在这里插入图片描述

VNode的属性

一个VNode对象通常包含以下属性:

  • tag:表示元素的标签名,如div、p等。
  • data:一个包含了元素属性的对象,如class、style、id等。
  • children:表示元素的子节点,可以是一个字符串、另一个VNode对象、或一个VNode对象的数组。

除此之外,VNode对象还可能包含一些用于渲染的属性,如下所示:

  • key:用于识别VNode,可以帮助框架更快地找到需要更新的元素。
  • el:用于保存真实DOM中的对应元素,方便后续操作。

在这里插入图片描述

在这里插入图片描述

生成过程

在前端框架中,生成VNode对象通常需要使用特定的函数,如在Vue中使用createElement函数,在React中使用JSX语法。下面以Vue中的createElement函数为例,来介绍VNode的生成过程。

createElement(tag, data, children)
  • tag:表示元素的标签名,可以是一个字符串或一个组件。
  • data:一个包含了元素属性的对象。
  • children:表示元素的子节点,可以是一个字符串、另一个VNode对象、或一个VNode对象的数组。

createElement函数的作用是创建一个VNode对象,代码示例如下:

import { createElement } from 'vue'

const vnode = createElement('div', { class: 'container' }, [
  createElement('h

如果我们不只是一个简单的div,而是有一大堆的元素,那么它会怎么样呢?

它们应该会形成一个VNode Tree

通常情况下一个复杂的页面会由多个VNode对象组成,这些VNode对象之间形成了一棵树状结构,被称为VNode Tree(虚拟DOM树)。VNode Tree中的每一个节点都对应着真实DOM树中的一个元素。

VNode Tree通常是由一个根节点开始,该根节点包含了整个页面的结构,同时它还有一些子节点,这些子节点可以是其他的VNode对象或者是字符串等简单类型的节点。

举个例子,一个包含了两个div的页面可以用下面的VNode Tree来表示:

{
  tag: 'div',
  data: { class: 'container' },
  children: [
    {
      tag: 'div',
      data: { class: 'left-panel' },
      children: [
        '这是左侧面板'
      ]
    },
    {
      tag: 'div',
      data: { class: 'right-panel' },
      children: [
        '这是右侧面板'
      ]
    }
  ]
}

上面的VNode Tree中,根节点是一个div元素,它有两个子节点,分别是左侧面板和右侧面板。这两个子节点也是VNode对象,它们的tag、data和children属性都可以自行定义,以适应不同的需求。

在框架内部,可以通过遍历VNode Tree来完成页面的渲染、更新等操作。因为VNode Tree可以在内存中进行快速操作,所以能够提高页面的性能。

示例二:

在这里插入图片描述

image.png

为什么需要Virtual DOM?

在传统的Web开发中,当我们想要修改页面上的某个元素时,通常的做法是直接操作真实的DOM节点,例如通过修改元素的属性、添加、删除子元素等来实现。然而这种做法存在以下一些问题:

  1. 直接操作真实DOM节点比较耗时,因为每次修改都会导致浏览器的重排和重绘,从而影响页面的性能和用户体验。
  2. 在复杂的应用中,需要频繁地操作DOM节点,这会导致代码的复杂性和维护难度增加,尤其是在多人协作的情况下。
  3. 直接操作DOM节点的代码可读性比较差,难以理解和调试。

为了解决这些问题,Virtual DOM应运而生。Virtual DOM是一种将页面抽象成一棵树的数据结构,它将真实DOM节点抽象为虚拟节点(VNode),并通过比较新旧两棵树的差异,最终只对需要更新的节点进行操作,从而减少了页面的重排和重绘,提高了页面的性能和用户体验。同时,Virtual DOM的抽象层次更高,代码可读性更好,能够降低代码的复杂性和维护难度。

思考

Virtual DOM 的出现,是为了解决DOM操作效率低下和可维护性差的问题,它将真实的DOM抽象成JavaScript对象,进行操作后再将差异更新到真实的DOM上,从而避免了频繁的重排和重绘,提高了Web应用的性能和可维护性。

但是,虚拟DOM也存在一些问题。首先,虚拟DOM本身也需要一定的计算和内存开销,可能会对应用性能造成一定的影响。其次,虚拟DOM只是解决了DOM操作的问题,而在实际应用中,还会有其他性能问题,例如网络请求、算法优化等。因此,我们需要综合考虑,选择合适的方案来解决问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866239.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Windows 常用工具系列 17 -- windows bat 脚本多参数处理】

请阅读【嵌入式开发学习必备专栏】 文章目录 bat 脚本命令行参数使用示例多参数处理使用示例遍历所有参数 bat 脚本命令行参数 在Windows批处理(.bat)脚本中接收命令行参数是一个常见的需求,这样的脚本能够根据提供的参数执行不同的操作。命…

VS 在多线程中仅调试某个线程

调试多线程程序时,只想观察某个线程的运行情况; 但是,由于线程切换执行,会导致调试时焦点在几个代码块之间跳来跳去,故需要解决这个问题。 参考文章: C#使用线程窗口调试多线程程序。 1 打开线程窗口&…

Unity开发中遇到的问题以及解决思路 Ver1.0

文章目录 Git1.明明连接成功了,为什么显示仓库不存在? UI1.从Resources加载图片:路径没错却加载为空?2.滚动页面想让他只在纵向或者横向滚动怎么办?3.滚动页面的元素是从中间向两边生成怎么办?4.如何让ui物…

Yolo v5实现细节(2)

Yolo v5代码实现细节 IOU系列损失 在之前的yolo v3中我们使用的定位损失主要使用的是差值平方的形式,通过预测边界框的参数和真实边界框的参数来进行计算求解的。 定位损失 L loc ( t , g ) ∑ i ∈ pos ( σ ( t x i ) − g ^ x i ) 2 ( σ ( t y i ) − g ^ …

高三学生的倒计时 给高考一个倒计时 让学习更有计划的进行

高三学生的压力是很大的,时间也是很紧迫,仅仅一年的时间,许多人都觉得不够用,为了让学子们更有时间紧迫感,更清晰的掌握时间,我们需要一个准确提醒的倒计时效果。 把这个倒计时放到班级电脑上,是…

DataGrip 2024 po for Mac 数据库管理工具解

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件(适合自己的M芯片版或Intel芯片版),将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功3、打开访达,点击【文…

LLMs 驱动的数据合成、整理和评估

1. AI 速读 总体概要 本文综述了大型语言模型(LLMs)在合成数据生成、筛选和评估方面的最新进展,旨在为学术和工业界提供深入、系统化的研究方向。文章强调了合成数据在解决真实世界数据局限性中的重要性,特别是在数据量和质量方…

汇聚荣做拼多多运营,是新手怎么做?

作为电商领域的一颗新星,拼多多以其独特的商业模式迅速崛起,吸引了众多商家和消费者的目光。对于新手来说,如何在拼多多平台上开展运营活动,成为了许多初入电商领域的人们关心的问题。本文将围绕如何做好拼多多运营这一核心内容&a…

类与对象(1)

1.c升级了类 C 语言结构体中只能定义变量,在 C 中,结构体内不仅可以定义变量,也可以定义函数。 比如: 之前在数据结构初阶中,用 C 语言方式实现的栈,结构体中只能定义变量 ;现在以 C 方式实现&…

期货交易记录20240626

文章目录 期货交易系统构建第一步、选品第二步、心态历练第三步、开仓纪律第四步、持仓纪律第五步、接下来的计划 2024年6月26号,开始写期货交易的第四篇日记。 交易记录:做了一笔纯碱的多单,在回撤了400个点左右后,看到企稳信号后…

升级外贸ERP保留历史数据,拥抱技术革新赢得未来

一些做了二十多年外贸的老公司,早期就通过使用ERP软件来进行订单的处理,但是随着互联网的发展,用的年岁久了,软件运行速度也变卡了,看到别人家的新功能也眼馋,但是就是不敢升级,担心一升级&…

数据采集Selenium中的弹窗处理

在爬虫技术中,弹窗处理是一个常见但具有挑战性的问题。Selenium作为一个强大的网页自动化工具,可以帮助我们有效地处理网页中的各种弹窗。本文将概述如何使用Selenium处理弹窗,并提供实现代码,代码中将使用代理IP技术。 概述 弹…

前端项目vue3/React使用pako库解压缩后端返回gzip数据

pako仓库地址:https://github.com/nodeca/pako 文档地址:pako 2.1.0 API documentation 外部接口返回一个直播消息或者图片数据是经过zip压缩的,前端需要把这个数据解压缩之后才可以使用,这样可以大大降低网络数据传输的内容&…

茴香豆接入微信个人助手部署

将rag产品接入微信工作群,自动回答问题,香吗?? let‘s go 1、打开openxlab平台,找到茴香豆web产品应用中心-OpenXLab 点击进入,设置知识库名字和密码 2、上传知识库文件和编辑正反例等 3、然后进行测试问答…

Gitlab合并代码并解决冲突演示

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

南信大尹志聪教授为一作在顶级综合性期刊《Natl. Sci. Rev.》发文:传统梅雨停摆,江南缘何不再多烟雨?

文章简介 论文名称:Traditional Meiyu–Baiu has been suspended by global warming 第一作者及单位:尹志聪(教授|南京信息工程大学大气科学学院) 通讯作者及单位:王会军(院士|南京信息工程大学大气科学学院) 文章发…

尚品汇-(七)

(1)在网关中实现跨域 全局配置类实现 包名:com.atguigu.gmall.gateway.config 创建CorsConfig类 Configuration public class CorsConfig {Beanpublic CorsWebFilter corsWebFilter(){// cors跨域配置对象CorsConfiguration configuration…

使用单调队列求滑动窗口最大值

单调队列:队列元素之间的关系具有单调性(从队首到队尾单调递增/递减),队首与队尾进行插入与删除操作,使队列保持单调递增/递减,由双端队列deque实现。 通过例题对单调队列进行分析掌握: 使用单…

【UE5.3】笔记4-自定义材质蓝图

正常来说,我们都是拿到什么材质用什么材质,那么我们如何去创建自定义的材质呢? 首先,创建MyMaterials文件夹用来存放我们自制的材质; 然后,右键创建一个材质,起个名字,双击打开&am…

操作符详解(上) (C语言)

操作符详解(上) 一. 进制转换1. 二进制2. 二进制的转换 二. 原码 补码 反码三. 操作符的分类四. 结构成员访问操作符1. 结构体的声明2. 结构体成员访问操作符 一. 进制转换 1. 二进制 在学习操作符之前,我们先了解一些2进制、8进制、10进制…