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.hqwc.cn/news/571773.html

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

相关文章

Lua模拟面向对象

13.2 逻辑热更新——Lua2-2_哔哩哔哩_bilibili parent中添加 模拟面向对象

Django之Web应用架构模式

一、Web应用架构模式 在开发Web应用中,有两种模式 1.1、前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示。前端与后端的耦合度很高 1.2、前后端分离 在前后端分离的应用模式中,后端仅返…

蓝桥杯学习笔记 单词分析

试题 G: 单词分析 时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分 [问题描述] 小蓝正在学习一门神奇的语言&#xff0c;这门语言中的单词都是由小写英文字母组成&#xff0c;有些单词很长&#xff0c;远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词&#xf…

Rust使用原始字符串字面量实现Regex双引号嵌套双引号正则匹配

rust使用Regex实现正则匹配的时候&#xff0c;如果想实现匹配双引号&#xff0c;就需要使用原始字符串字面量&#xff0c;不然无法使用双引号嵌套的。r#"..."# 就表示原始字符串字面量。 比如使用双引号匹配&#xff1a; use regex::Regex;fn main() {println!(&qu…

Spring MVC学习记录

一、MVC模式 1. MVC模型&#xff1a;一种软件架构模式 Model-View-Controller&#xff08;模型-视图-控制器&#xff09;模式&#xff0c;目标是将软件的用户界面&#xff08;即前台页面&#xff09;和业务逻辑分离&#xff0c;使代码具有更高的可扩展性、可复用性、可维护性以…

Shadow Tactics

本题链接&#xff1a; 题目&#xff1a; 样例&#xff1a; 输入 1 1 3 3 U 2 2 2 输出 YES 思路&#xff1a; 根据题意&#xff0c;隼人的坐标是不会动的&#xff0c;并且士兵只能直线来回行动。 所以这里我们需要分成三种情况。 1、隼人坐标在士兵走动路线之间&#xff0c;…

东方博宜 1963. 贝贝的选择

东方博宜 1963. 贝贝的选择 #include<iostream> using namespace std; int main() {int n ;cin >> n ;int cnt ;cnt 0 ;for(int i 1 ; i < n ; i){int j ;j i ;int g ;while(j>0){g j % 10 ;if (g6){cnt 1 ;break ;}j j / 10 ; }}if (cnt % 2 0)cou…

Scala介绍与环境搭建

Scala环境搭建与介绍 一、Scala环境搭建 1、环境准备与下载 2、验证Scala 3、IDEA新建项目&#xff0c;配置Scala&#xff0c;运行Hello world 二、Scala介绍 1、Scala 简介 2、Scala 概述 一、Scala环境搭建 1、环境准备与下载 JDK1.8 Java Downloads | Oracle 下载需求版本…

【wails】(10):研究go-llama.cpp项目,但是发现不支持最新的qwen大模型,可以运行llama-2-7b-chat

1&#xff0c;视频演示地址 2&#xff0c;项目地址go-llama.cpp 下载并进行编译&#xff1a; git clone --recurse-submodules https://github.com/go-skynet/go-llama.cpp cd go-llama.cpp make libbinding.a项目中还打了个补丁&#xff1a; 给 编译成功&#xff0c;虽然有…

164、应急响应——挖矿脚本检测指南样本定性文件清楚入口修复

文章目录 windows 挖矿脚本Linux挖矿脚本&#xff08;应急&#xff09;Windows挖矿脚本&#xff08;应急&#xff09; 挖矿的前提是&#xff0c;黑客已经取得了你电脑的权限&#xff0c;如何取得是重点。 判断被植入挖矿脚本&#xff0c;最重要的是看CPU和GPU占用情况。 win…

C++电子宠物商店

一、功能描述 店内有不同类型的电子宠物 1.每种电子宠物能通过显示出来的文本提出需要或表示情绪如&#xff1a;饿、渴、饱涨、困、不舒服、高兴、生气、伤心、绝望、无聊等。 2.店员用户通过键盘操作“饲养”电子宠物&#xff0c;给它实施喂饭、喂水、带它上厕所、陪它玩耍、…

《无名之辈》天涯镖局攻略:高效拉镖窍门!

《无名之辈》天涯镖局开启要注意什么&#xff0c;在这里&#xff0c;每一次运镖都是一次刺激的冒险&#xff0c;而掌握合适的策略将让你事半功倍。以下是天涯镖局的开启攻略&#xff0c;助你在危机四伏的路途上赢得胜利。 ① 拉取适当级别的包子和加速卡 在天涯镖局中&#xf…