vue3源碼分析 -- runtime

runtime運行時,主要在packages/runtime-core目錄下,核心提供了hrender等函數。在理解它們之前,我們需要了解下HTML DOM 樹虛擬 DOM等概念

HTML DOM 樹

通過節點構成的一個樹形結構,我們稱為HTML DOM節點樹。DOM 文檔里面做了詳細解釋,這里就不再展開講解,通過以下例子來簡單理解:

<div> <h1>hello h1</h1> <!-- 這里是注釋 --> hello div 
</div>

瀏覽器運行上述代碼時,它會生成一個對應的DOM 樹來展示:

在這里插入圖片描述

虛擬DOM

虛擬 DOM 是一種編程概念,意為將目標所需的 UI 通過數據結構“虛擬”地表示出來,保存在內存中,然后將真實的 DOM 與之保持同步,詳細解釋可見 Vue文檔

通過以下這個例子來說明:

可以看出虛擬 DOM 類似把真實 DOM 轉換成一個 VNode 對象,該對象存在節點的類型type、子節點信息children等屬性,而子節點有可能是字符串,也可能是包含其他子節點的數組

// 真實 DOM 
<div>text</div>// 虛擬 DOM 表示
const vnode = {type: 'div', // 父節點類型 divchildren: 'text' // 子節點內容 text
}// 真實 DOM
<div><h1>hello h1</h1><!-- TODO: comment -->hello div
</div>// 虛擬 DOM 表示 
const vnode = {type: 'div', // 父節點類型 divchildren: [ // 多個子節點{type: 'h1', // 子節點類型 h1children: 'hello h1' // 子節點內容 hello h1       },{type: Comment, // 子節點類型 Commentchildren: 'TODO: comment' // 子節點內容 TODO: comment       },'hello div'   // 子節點內容 hello div]
}

而在runtime運行時,渲染器render會遍歷整個虛擬 DOM 樹,并據此構建真實的 DOM 樹,這個過程把它叫做掛載mount

當這個VNode對象發生變化時,那么我們會對比舊的 VNode新的 VNode之間的區別,找出它們之間的區別,并應用這其中的變化到真實的 DOM 上,這個過程被稱為更新patch

h

Vue中轉換為VNode對象就是通過h函數來完成的,通過調試來看下h函數的返回值:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title><script src="../../dist/vue.global.js"></script></head><body><div id="app"></div><script>const { h } = Vuedebuggerconst vnode = h('div',{class: 'test'},'hello render')console.log(vnode)</script></body>
</html>

h函數定義在packages/runtime-core/src/h.ts文件中,它接收三個參數:

  • type: string | Component:既可以是一個字符串(用于原生元素),也可以是一個 Vue 組件定義
  • props?: object | null:要傳遞的 prop
  • children?: Children | Slot | Slots:子節點

該 vnode 如下:

在這里插入圖片描述

最終VNode對象通過render函數渲染為真實 DOM,該render函數定義在packages/runtime-core/src/renderer.ts文件中,實際執行的是createRenderer方法,它接收兩個參數:

  • vnode虛擬節點樹,或者叫做虛擬 DOM 樹
  • container承載的容器,真實節點渲染的位置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74292.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74292.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

清明假期在即

2025年4月2日&#xff0c;6~22℃&#xff0c;一般 遇見的事&#xff1a;這么都是清明出去玩&#xff1f;你們不掃墓的么。 感受到的情緒&#xff1a;當精力不放在一個人身上&#xff0c;你就會看到很多人&#xff0c;其實可以去接觸的。 反思&#xff1a;抖音上那么多不幸和幸…

tomcat 目錄結構組成

文章目錄 背景文件結構層級一些常用的路徑 背景 現在非常多的 java web 服務部署在 linux 服務器中&#xff0c;我們服務器中的 tomcat 會有各種文件路徑&#xff0c;看下它有哪些文件 文件結構層級 ├── bin/ # 核心腳本和啟動文件 ├── conf/ # …

多層內網滲透測試虛擬仿真實驗環境(Tomcat、ladon64、frp、Weblogic、權限維持、SSH Server Wrapper后門)

在線環境:https://www.yijinglab.com/ 拓撲圖 信息收集 IP地址掃描 確定目標IP為10.1.1.121 全端口掃描 訪問靶機8080端口,發現目標是一個Tomcat服務,版本

NOIP2010提高組.引水入城

*前置題目 901. 滑雪 #include <iostream> #include <algorithm> #include <cstring>using namespace std;const int N 310, INF 0x3f3f3f3f; const int dx[4] {0, -1, 0, 1}, dy[4] {1, 0, -1, 0};int n, m, h[N][N]; int f[N][N]; int ans;int dfs(i…

Share02-小小腳本大大能量

各位看官你們好&#xff0c;又是一篇共享知識點的文章&#xff0c;今天我們來聊一聊腳本在我們上位組態中的作用。各個廠家的上位軟件或者觸屏軟件都內嵌了腳本功能&#xff0c;有的是二次開發的固定指令格式&#xff0c;有的可以接收廣域的標準語言指令。它帶給我們更多的方便…

LangChain接入azureopenai步驟(2025年初)

背景&#xff1a; 為了快速且規范的實現ai應用&#xff0c;可使用LangChain框架&#xff0c;便于后期維護。雖然deepseek異軍突起&#xff0c;在終端用戶占有率很高&#xff0c;但是仔細查閱相關api接口&#xff0c;尤其是自有知識庫需要使用的文本向量化模型方面&#xff0c;o…

阿里云國際站代理商:模型訓練中斷數據丟失怎么辦?

定期保存訓練狀態&#xff1a;在訓練過程中&#xff0c;設定自動保存訓練狀態的頻率&#xff0c;將模型的參數、優化器狀態、訓練數據的中間結果等定期保存到存儲介質上。這樣&#xff0c;當中斷發生時&#xff0c;可以恢復到上次保存的狀態&#xff0c;避免訓練進度的損失。 …

C++17更新內容匯總

C17 是 C14 的進一步改進版本&#xff0c;它引入了許多增強特性&#xff0c;優化了語法&#xff0c;并提升了編譯期計算能力。以下是 C17 的主要更新內容&#xff1a; 1. 結構化綁定&#xff08;Structured Bindings&#xff09; 允許同時解構多個變量&#xff0c;從 std::tup…

2025年Axure RP9無法免費使用Axure Cloud的解決方案

解決方案 更換新賬號&#xff0c;換了一個郵箱注冊&#xff0c;再登陸&#xff0c;又會給你30天的試用期。 對&#xff0c;辦法就是換個郵箱注冊&#xff0c;又續上30天的試用期。

供應鏈中的的“四流合一”

在供應鏈中&#xff0c;物流、資金流、信息流、商流是共同存在的&#xff0c;商流、信息流和資金流的結合將更好的支持和加強供應鏈上、下游企業之間的貨物、服務往來&#xff08;物流&#xff09;。 一、商流 在供應鏈中&#xff0c;上下游供應商的資金鏈條均可被金融服務機構…

MonkeyDev 如何創建一個root級級別的app

前提條件:有越獄的手機,XCode中已經安裝了Monkeydev 1. 和普通應用一個創建一個ios的工程 2. 在App的TARGETS>build setting> 中設置Apple Development 3. 設置User-Defined的配置 CODE_SIGNING_ALLOWED = NO MonkeyDevBuildPackageOnAnyBuild = NO MonkeyDevClearUi…

Excel時間類型函數(包括today、date、eomonth、year、month、day、weekday、weeknum、datedif)

目錄 1. TODAY()2. DATE()3. EOMONTH()4. YEAR()5. MONTH()6. DAY()7. WEEKDAY()8. WEEKNUM()9. DATEDIF()10.&#x1f4cc; 函數擴展與應用11. &#x1f4da; 時間函數基礎概念與分類 Excel 提供了許多 日期與時間類型的函數&#xff0c;用于操作與處理日期或時間數據。這些函…

Lumerical ------ Edge coupler design

Lumerical ------ Edge coupler design 引言正文無 Si Substrate 的仿真步驟有 Si Substrate 的仿真步驟引言 本文,我們將使用官方提供的 Edge coupler 設計教程,但是中間會帶有作者本人的設計的感悟。 正文 無 Si Substrate 的仿真步驟 打開 Edge_Coupler_No_Substrate.l…

Spring筆記06-數據持久化

在 Spring 中&#xff0c;數據持久化是將應用程序中的數據保存到持久化存儲&#xff08;如數據庫&#xff09;中的過程 &#xff0c;主要通過以下幾種方式實現&#xff1a; 1. JDBC&#xff08;Java Database Connectivity&#xff09; 原理&#xff1a;JDBC 是 Java 訪問關系…

spring boot集成reids的 RedisTemplate 序列化器詳細對比(官方及非官方)

RedisTemplate 序列化器詳細對比&#xff08;官方及非官方&#xff09; 1. 官方序列化器 (1) JdkSerializationRedisSerializer 特點&#xff1a; 基于 Java 原生序列化&#xff08;Serializable&#xff09;。支持復雜對象&#xff08;需實現 Serializable 接口&#xff09;…

ssh私鑰文件登錄問題:Load key invalid format

問題 在mac上面使用私鑰文件登錄時候&#xff0c;出現了如下錯誤&#xff1a; Load key “xxx.pem”: invalid format 但是&#xff0c;這個私鑰文件在win上面能夠正常使用ssh進行遠程登錄。在mac上面不能。而且&#xff0c;分別在win和mac上面分別查看了這兩個私鑰文件的md5…

AI戰略群與星際之門:軟銀AI投資版圖計劃深度解析

一、星際之門:萬億美元級 AI 基礎設施革命 1.1 項目背景與戰略定位 在 AI 技術迅猛發展的今天,算力已成為推動其前進的核心動力。軟銀聯合 OpenAI、甲骨文、英偉達、微軟、arm推出的 “星際之門”(Stargate)計劃,無疑是 AI 領域的一顆重磅炸彈。作為 AI 領域史上最大單筆…

教務系統ER圖

實體 1. 學生&#xff1a;具有姓名、學號、性別、系編號、電話、出生年月等屬性。學號通常是學生的唯一標識。 2. 課程&#xff1a;包含課程編號、課程名稱、課程學分、課程學時等屬性。課程編號一般用于唯一標識一門課程。 3. 教師&#xff1a;屬性有教師編號、教師名字、性別…

大數據(4.4)Hive多表JOIN終極指南:7大關聯類型與性能優化實戰解析

目錄 背景一、Hive JOIN類型與語法詳解1. 基礎JOIN類型2. 高級JOIN類型 二、JOIN實戰案例與調優案例1&#xff1a;兩表內連接&#xff08;訂單與用戶關聯&#xff09;案例2&#xff1a;多表鏈式JOIN&#xff08;用戶-訂單-商品&#xff09;案例3&#xff1a;處理數據傾斜&#…

【28BYJ-48】STM32同時驅動4個步進電機,支持調速與正反轉

資料下載&#xff1a;待更新。。。。 先驅動起來再說&#xff0c;干中學&#xff01;&#xff01;&#xff01; 1、實現功能 STM32同時驅動4個步進電機&#xff0c;支持單獨調速與正反轉控制 需要資源&#xff1a;16個任意IO口1ms定時器中斷 目錄 資料下載&#xff1a;待更…