vue3从精通到入门2:虚拟DOM的生成与真实DOM的转化

虚拟 DOM 实现是 Vue 框架的核心部分之一,它负责在真实 DOM 之上抽象出一个轻量级的、可复用的 JavaScript 对象树,用于高效地更新视图。

什么是虚拟DOM?

虚拟 DOM 是一个编程概念,它将真实的 DOM 树抽象为一个轻量级的 JavaScript 对象树。当应用状态发生变化时,Vue 会先比较新的虚拟 DOM 树和旧的虚拟 DOM 树之间的差异,然后只更新这些差异部分对应的真实 DOM,而不是重新渲染整个页面。这种方式大大提高了渲染性能。

而我们如何将虚拟DOM转化成真实DOM呢?

App.vue:

<template><div><a href="https://vitejs.dev" target="_blank"><img src="/vite.svg" class="logo" alt="Vite logo" /></a><a href="https://vuejs.org/" target="_blank"><img src="./assets/vue.svg" class="logo vue" alt="Vue logo" /></a></div><HelloWorld msg="Vite + Vue" />
</template>

从我们编写的vue代码以及转换成真实DOM整个流程如下:

模板 > render函数 > 虚拟DOM > 真实DOM

上图中是我写的App.vue。我们将其打印出来

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'console.log(App); // 打印出来的模板createApp(App).mount('#app')

 打印结果:

我们可以看到这个render函数,我们的虚拟DOM是由render函数创建的。

export function render(_ctx, _cache, $props, $setup, $data, $options) {const _component_HelloWorld = _resolveComponent("HelloWorld")return (_openBlock(), _createElementBlock("template", null, [_createElementVNode("div", null, [_createElementVNode("a", {href: "https://vitejs.dev",target: "_blank"}, [_createElementVNode("img", {src: "/vite.svg",class: "logo",alt: "Vite logo"})]),_createElementVNode("a", {href: "https://vuejs.org/",target: "_blank"}, [_createElementVNode("img", {src: "./assets/vue.svg",class: "logo vue",alt: "Vue logo"})])]),_createVNode(_component_HelloWorld, { msg: "Vite + Vue" })]))
}

当我的虚拟DOM创建出来后,如何转成真实DOM呢?

这里用到了patch 函数:

patch 是 Vue 中用于比较和更新虚拟 DOM 的核心函数。它接受两个参数:旧的 VNode 和新的 VNode。根据这两个节点的类型和属性等信息,patch 函数会决定是否需要更新真实 DOM,以及如何更新。

简单表示下patch相关作用!

function patch(  n1: VNode | null,  // 旧虚拟DOMn2: VNode,  // 新的虚拟DOMcontainer: HostNode,  anchor: ?HostNode = null,  parentComponent: ?Component = null,  parentSuspense: ?SuspenseBoundary = null,  isSVG: boolean = false,  optimized: boolean = false  
): VNode {  // ...  const { type, ref, shapeFlag } = n2;  switch (type) {  case Text:  // 处理文本节点  // ...  break;  case Comment:  // 处理注释节点  // ...  break;  case Static:  // 处理静态节点  // ...  break;  case Fragment:  // 处理 Fragment 节点  // ...  break;  default:  // 处理元素或组件节点  if (shapeFlag & ShapeFlags.ELEMENT) {  // ... 处理元素节点 ...  } else if (shapeFlag & ShapeFlags.COMPONENT) {  // ... 处理组件节点 ...  }  // ...  }  // ... 其他逻辑,如处理子节点、引用、挂载等 ...  
}

后面单开一章讲解patch!

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

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

相关文章

2024年学鸿蒙开发有“钱”途吗?

随着科技的不断发展和智能设备的普及&#xff0c;鸿蒙系统作为华为自主研发的操作系统&#xff0c;正逐渐受到市场的关注。2024年&#xff0c;学鸿蒙开发是否有前途&#xff0c;成为了很多开发者关心的问题。本文将从多个角度分析鸿蒙系统的发展前景&#xff0c;以及学习鸿蒙开…

Qt源程序编译及错误问题解决

Error 5 while parsing C:/qt-everywhere-src-6.6.2/qt-build/qtdeclarative/src/qmlmodels/meta_types/qt6qmlmodels_release_metatypes.json: illegal value .json 文件为空文件0字节&#xff0c;加 “[]”&#xff0c;不要引号。可以解决这类错误。 Qt编译 Qt for Windows…

寻找旋转排序数组中的最小值

题目链接 寻找旋转排序数组中的最小值 题目描述 注意点 1 < n < 5000-5000 < nums[i] < 5000nums中的所有整数 互不相同nums原来是一个升序排序的数组&#xff0c;并进行了 1 至 n 次旋转找出并返回数组中的最小元素设计一个时间复杂度为 O(log n) 的算法解决此…

2024年上半年数学建模竞赛一览表(附赠12场竞赛的优秀论文+格式要求)[电工、妈杯、数维、五一等12场]

为了帮助大家更好地备战今年上半年十二场数学建模竞赛&#xff0c;我们为大家收集到了这十二场相关竞赛的优秀论文以及格式要求&#xff0c;具体内容如下所示。 资料获取 在文末 文中资料来源 名称竞赛官方网站天府杯https://www.tfmssy.org.cn/认证杯http://www.tzmcm.cn/i…

AI Agent(LLM Agent)入门解读

1. 什么是AI Agent&#xff1f; AI Agent可以理解为一个智能体&#xff0c;包括感知模块、规划决策模块和行动模块&#xff0c;类似于人类的五官、大脑和肢体。它能帮助人类处理复杂的任务&#xff0c;并能根据环境反馈进行学习和调整。 五官可以理解为感知模块&#xff0c;大…

游戏AI:大模型在游戏内容生成与交互体验优化中的应用

游戏AI&#xff1a;大模型在游戏内容生成与交互体验优化中的应用 1. 背景介绍 随着人工智能技术的不断发展&#xff0c;游戏AI已经从简单的决策树和有限状态机&#xff0c;发展到了基于机器学习和深度学习的复杂系统。大模型&#xff0c;如GPT-3等&#xff0c;在游戏内容生成…

ABAP:BP 供应商创建修改BAPI和供应商银行信息创建修改BAPI(来源于网络)

ABAP:BP 供应商创建修改BAPI和供应商银行信息创建修改BAPI 供应商创建及BAPI:cl_md_bp_maintain>maintain 供应商银行信息创建BAPI:BAPI_BUPA_BANKDETAIL_ADD 供应商银行信息更新BAPI:BAPI_BUPA_BANKDETAIL_CHANGE 复制代码 FORM frm_create_bp .DATA: lt_zfis006 TYPE TAB…

vue添加监听页面未操作倒计时-跳转页面

1、声明定时器变量 countDown: 120, countDownTimer: null, 2、倒计时函数 // 倒计时countDownFun() {this.countDownTimer setInterval(() > {this.countDown - 1;if (this.countDown < 0) {clearInterval(this.countDownTimer);this.countDownTimer null;localStor…

SpringBoot学习笔记一、SpringBoot应用初创建以及应用

一、创建SpringBoot的两种方式 1.Spring Initializr方式创建 &#xff08;1&#xff09;第一步在IDEA中选择 File-->NEW-->Project &#xff0c;选择 Spring Initializr &#xff0c;指定Maven坐标、包名、指定 JDK 版本 1.8 &#xff0c;然后点击Next 。如下图&#x…

AcWing 1247.后缀表达式

思路&#xff1a;贪心 由题目中我们可以知道&#xff0c;我们需要计算的是一个后缀表达式&#xff0c;要求尽可能的运算出最大的数。它给了我们加号和负号&#xff0c;让我们自己安排需要怎么做。 其实这里涉及到一个小学的知识点&#xff0c;也就是在括号遇到负号的时候&…

配置文件 application properties

配置文件 application properties 1 参数交由配置文件集中管理 Value(“${}”)用于外部配置的属性注入 在之前编写的程序中进行文件上传时&#xff0c;需要调用AliOSSUtils工具类&#xff0c;将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时&#xff0c…

tensorflow安装以及在Anaconda中安装使用

在遥感领域进行深度学习时&#xff0c;通常使用python进行深度学习&#xff0c;会使用到tensorflow的安装&#xff0c;今天小编就给大家介绍如何在Anaconda中安装tensorflow&#xff01; 下载Anaconda Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open…

文件服务: 功能介绍

文章目录 一、需求背景二、核心功能1、功能要求2、非工能要求 三、存储方式四、实现方式五、技术栈说明 一、需求背景 二、核心功能 1、功能要求 文件上传文件预览文件分片上传文件分片合并文件秒传文件断点续传文件下载 2、非工能要求 高扩展性&#xff1a;方便添加新的存…

浮动布局与定位布局

目录 前言: 浮动布局&#xff08;Float Layout&#xff09;: 定位布局&#xff08;Positioning Layout&#xff09;: 1.传统布局: 1.1文档流布局: 1.1.1基本的布局方式: 1.1.2 块级元素: 1.1.3调整元素: 1.2浮动布局: 1.2.1浮动布局允许元素向左或向右浮动&#xff0c;使…

前端学习-HTML基础

一、简介 1.介绍 网页就是html文件&#xff0c;前端编写代码->浏览器解析代码->呈现网页 谷歌浏览器Blink内核最好 2.Web标准 让网页设计排版更统一规范 结构&#xff1a;对网页元素进行整理和分类&#xff0c;html 表现&#xff1a;设置网页元素的板式、颜色、大小等外…

PTL库位电子标签系统仓库目视化管理解决方案

PTL库位电子标签系统是一种先进的仓库管理技术&#xff0c;通过数字化和智能化手段实现了仓库目视化管理&#xff0c;为仓储行业带来了革命性的改变。本文将从PTL库位电子标签系统的特点、优势以及在仓库目视化管理中的应用等方面进行探讨。 PTL库位电子标签系统具有以下特点&a…

握手和挥手

TCP/IP协议的三次握手四次挥手 就是ACK发来发去 位于OSI模型的哪层&#xff1a; Tcp协议&#xff1a;传输层&#xff08;类似的还有websocket的 wss协议&#xff09; http协议&#xff1a;应用层 挥手的契机是nodejs的http模块决定的 如果没有开启请求头的Connection: keep-al…

STM32F10X开发环境的搭建

一、keil软件安装 找到keil软件包&#xff0c;解压缩&#xff0c;找到keil5安装软件&#xff1a; 鼠标右键选择以管理员权限运行。点击next&#xff0c;直到安装结束。 安装完成后在桌面会出现keil5软件图标&#xff1a; 然后再安装相应的芯片支持包&#xff1a;我们用的是stm…

精酿啤酒:多阶段发酵工艺的特点与优势

Fendi Club啤酒采用多阶段发酵工艺&#xff0c;这种工艺在啤酒酿造中具有显著的特点和优势。 首先&#xff0c;多阶段发酵工艺是一种复杂的酿造过程&#xff0c;它包括多个阶段的发酵和陈化过程。这种工艺需要切确控制每个阶段的时间、温度和酵母种类等参数&#xff0c;以确保…

基于DWT(离散小波变换)的图像水印算法,Matlab实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码代做/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供…