學習 Vue 3 源碼

Vue 3 是一款流行的前端框架,它的數據代理和虛擬 DOM 實現是其核心功能之一

Vue 3 的數據代理

在 Vue 3 中,數據代理是指將組件實例的屬性代理到其內部狀態對象上。這使得開發者可以使用更便捷的方式來訪問和修改組件的狀態。

Vue 3 的數據代理實現主要包含以下兩個步驟:

1. 在組件實例上創建一個 `$data` 屬性,用于存儲組件的內部狀態。
2. 使用 `Object.defineProperty()` 函數將組件實例的屬性代理到 `$data` 對象上。下面是一個簡單的示例代碼,演示了如何在 Vue 3 中實現數據代理:

function proxy(target, sourceKey, key) {Object.defineProperty(target, key, {get() {return target[sourceKey][key];},set(value) {target[sourceKey][key] = value;},});
}const App = {data() {return {message: 'Hello, Vue 3!',};},
};const vm = {$data: App.data(),
};for (const key in vm.$data) {proxy(vm, '$data', key);
}console.log(vm.message); // 輸出:Hello, Vue 3!
vm.message = 'Hello, World!';
console.log(vm.message); // 輸出:Hello, World!


```

在上面的示例代碼中,我們通過 `proxy()` 函數將 `$data` 對象中的屬性代理到 `vm` 對象上。通過這種方式,我們可以非常方便地訪問和修改組件的內部狀態。

Vue 3 的虛擬 DOM

Vue 3 的虛擬 DOM 是指將組件的結構表示為一個樹形結構,然后使用 JavaScript 對象來描述該結構。這使得開發者可以更方便地操作組件,并且可以提高應用程序的性能。

Vue 3 的虛擬 DOM 實現主要包含以下兩個步驟:

1. 創建一個 JavaScript 對象來描述組件的結構。
2. 使用遞歸函數遍歷該對象,并將其轉換為真實的 DOM 元素。

下面是一個簡單的示例代碼,演示了如何在 Vue 3 中實現虛擬 DOM:

function createVNode(tag, props, children) {return {tag,props,children,};
}function render(vnode, container) {if (typeof vnode === 'string') {container.textContent = vnode;return;}const { tag, props, children } = vnode;const element = document.createElement(tag);if (props) {for (const key in props) {element.setAttribute(key, props[key]);}}if (children) {children.forEach(child => {render(child, element);});}container.appendChild(element);
}const App = createVNode('div', { id: 'app' }, [createVNode('p', null, ['Hello, Vue 3!']),
]);render(App, document.getElementById('app'));

在上面的示例代碼中,我們創建了一個簡單的虛擬 DOM 樹,并使用 `render()` 函數將其轉換為真實的 DOM 元素。通過這種方式,我們可以更方便地操作組件,并且可以提高應用程序的性能。

總結

Vue 3 的數據代理和虛擬 DOM 是其核心功能之一,在開發應用程序時非常重要。當然,上述代碼只是簡單的實現了vue3的部分功能,具體還需要以官方文檔為主

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

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

相關文章

docker-centos中基于keepalived+niginx模擬主從熱備完整過程

文章目錄 一、環境準備二、主機1、環境搭建1.1 鏡像拉取1.2 創建網橋1.3 啟動容器1.4 配置鏡像源1.5 下載工具包1.6 下載keepalived1.7 下載nginx 2、配置2.1 配置keepalived2.2 配置nginx2.2.1 查看nginx.conf2.2.2 修改index.html 3、啟動3.1 啟動nginx3.2 啟動keepalived 4、…

【HarmonyOS開發】控件開發過程中,知識點記錄

1、問題記錄及解決方案 1.1 資源(Icon&i18n)問題 控件:只有一個JS文件,不會將任何資源型文件(圖片、字體、默認文字等)打包到SO中。因此,當我們開發控件時,需要將需要使用到的資…

【機器學習】042_遷移學習

一、概述、定義 目的: 遷移學習的目的是將某個領域或任務上學習到的模式、知識應用到不同但相關的領域里,獲取更多數據,而不必投入許多時間人力來進行數據的標注。 舉例: 已經會下中國象棋,就可以類比著來學習國際…

Java單元測試:JUnit和Mockito的使用指南

引言: 在軟件開發過程中,單元測試是一項非常重要的工作。通過單元測試,我們可以驗證代碼的正確性、穩定性和可維護性,幫助我們提高代碼質量和開發效率。本文將介紹Java中兩個常用的單元測試框架:JUnit和Mockito&#x…

Navicat連接Oracle數據庫

Navicat連接Oracle數據庫 打開服務里面找到Oracle服務 OracleServerXE或者OracleServerTTL 創建數據庫連接 連接名默認自己起 主機選擇本地 端口默認 服務名在服務中可以找到輸入后綴 用戶名默認都是system 密碼是創建oracle時候填寫的口令 點擊測試連接即可

Spring Boot中的事務是如何實現的?懂嗎?

SpringBoot中的事務管理,用得好,能確保數據的一致性和完整性;用得不好,可能會給性能帶來不小的影響哦。 基本使用 在SpringBoot中,事務的使用非常簡潔。首先,得感謝Spring框架提供的Transactional注解&am…

【金融數據分析】計算滬深300指數行業權重分布并用餅圖展示

前言 前面的文章我們已經介紹了如何獲取滬深300成分股所述行業以及權重的數據,想要了解這部分內容的小伙伴可以閱讀上一篇文章 springbootjdbcTemplatesqlite編程示例——以滬深300成分股數據處理為例-CSDN博客 那么有了上文獲取的數據,我們實際上可以…

【rabbitMQ】rabbitMQ控制臺模擬收發消息

目錄 1.新建隊列 2.交換機綁定隊列 3.查看消息是否到達隊列 總結: 1.新建隊列 2.交換機綁定隊列 點擊amq.fonout 3.查看消息是否到達隊列 總結: 生產者(publisher)發送消息,先到達交換機,再到隊列&…

微信小程序uni-app:常用Form表單組件使用示例

目錄 input 輸入框picker 選擇器 input 輸入框 https://developers.weixin.qq.com/miniprogram/dev/component/input.htmlhttps://uniapp.dcloud.net.cn/component/input.html <inputclass"input-class"type"text"v-model"value"placeholde…

Linux下文本三劍客:grep、awk、sed之對比

一、grep 主要用于搜索某些字符串&#xff1b;sed、awk 用于處理文本&#xff1a; grep基本是以行為單位處理文本的&#xff1b; 而awk可以做更細分的處理&#xff0c;通過指定分隔符將一行&#xff08;一條記錄&#xff09;劃分為多個字段&#xff0c;以字段為單位處理文本。…

python輸出菱形字符圖案 附實戰代碼

下面是一個Python程序&#xff0c;可以用來輸出菱形字符圖案。這個程序使用了兩個嵌套的for循環&#xff0c;以及字符串連接操作。 # 獲取用戶輸入 n int(input("請輸入菱形的邊長&#xff1a;"))# 生成上半部分菱形 for i in range(1, n 1, 2):print(" &quo…

SDK,但未在應用內的隱私政策/在AppGallery Connect上提交的隱私政策內容中進行明示,不符合華為應用市場審核標準。

&#xff08;暫時用不到的也建議收藏一下&#xff0c;因為文章持續更新中&#xff09; 最新更改時間&#xff1a;20023-12-10 第三方SDK合集列表 為了確保用戶個人信息的安全&#xff0c;我們對使用到的第三方提供的軟件開發包&#xff08;SDK&#xff09;進行了嚴格的安全檢…

期末速成數據庫極簡版【存儲過程】(5)

目錄 【7】系統存儲過程 【8】用戶存儲過程——帶輸出參數的存儲過程 創建存儲過程 存儲過程調用 【9】用戶存儲過程——不帶輸出參數的存儲過程 【7】系統存儲過程 系統存儲我們就不做過程講解用戶存儲過程會考察一道大題&#xff0c;所以我們把重點放在用戶存儲過程。…

vscode 編寫爬蟲爬取王者榮耀壁紙

網上關于爬蟲大部分教程和編輯器用的都不是vscode &#xff0c;此教程用到了vscode、Python、bs4、requests。 vscode配置Python安裝環境可以看看這個大佬的教程 03-vscode安裝和配置_嗶哩嗶哩_bilibili vscode配置爬蟲環境可以參考這個大佬的教程【用Vscode實現簡單的python…

U4_1 語法分析之自頂向下分析

文章目錄 一、定義1、任務2、對比3、方法4、自頂向下面臨問題 二、自頂向下分析1、概念2、特點3、二義性問題4、左遞歸問題1&#xff09;概念2&#xff09;消除3&#xff09;間接左遞歸 5、回溯問題1&#xff09;概念2&#xff09;消除3&#xff09;解決方法 6、總結 三、遞歸子…

Java 線程池中 submit() 和 execute() 方法有什么區別?

Java 線程池中 submit() 和 execute() 方法有什么區別&#xff1f; 在 Java 中&#xff0c;ExecutorService 接口是用于管理和執行線程的框架&#xff0c;它定義了兩個用于提交任務的方法&#xff1a;submit() 和 execute()。這兩種方法有一些區別&#xff1a; 返回值&#xf…

【Proteus仿真】【51單片機】光照強度檢測系統

文章目錄 一、功能簡介二、軟件設計三、實驗現象聯系作者 一、功能簡介 本項目使用Proteus8仿真51單片機控制器&#xff0c;使共陰數碼管&#xff0c;PCF8591 ADC模塊、光敏傳感器等。 主要功能&#xff1a; 系統運行后&#xff0c;數碼管顯示光傳感器采集光照強度值&#xff…

Gitzip插件【Github免翻下載】

今天給大家推薦一個github下載的插件&#xff0c;平常大家下載應該無外乎就是以下兩種&#xff1a; Download zip利用git clone 但是這兩種各有各的弊端&#xff0c;前者一般需要科學上網才可以&#xff0c;后者下載不穩定經常中途斷掉。 今天給推薦一個款瀏覽器插件-Gitzip.大…

基于SSM的java衣服商城

基于SSM的java衣服商城 一、系統介紹二、功能展示四、其他系統實現五、獲取源碼 一、系統介紹 項目類型&#xff1a;Java EE項目 項目名稱&#xff1a;基于SSM的美衣商城 項目架構&#xff1a;B/S架構 開發語言&#xff1a;Java語言 前端技術&#xff1a;Layui等 后端技術…

Flask和Vue框架實現WebSocket消息通信

1 安裝環境 1.1 安裝Flask環境 主要的安裝包 Flask、Flask-SocketIO&#xff0c;注意Python版本要求3.6 # Flask-SocketIO參考地址 https://flask-socketio.readthedocs.io/en/latest/ https://github.com/miguelgrinberg/flask-socketio更新基礎環境 # 更新pip python -m …