vue的響應式原理

Vue.js 的響應式原理是其核心特性之一,使得數據變化能夠自動更新到視圖。Vue 的響應式系統主要依賴于 Object.defineProperty(在 Vue 2.x 中)和 Proxy(在 Vue 3.x 中)來實現數據的觀察和更新。以下是對 Vue 響應式原理的詳細解釋。

1. Vue 2.x 的響應式原理

在 Vue 2.x 中,Vue 使用 Object.defineProperty 來實現數據的響應式。

1.1 數據劫持

當 Vue 實例被創建時,它會遍歷 data 對象的所有屬性,并使用 Object.defineProperty 將每個屬性轉換為 getter 和 setter。這樣,當屬性被訪問或修改時,Vue 可以執行相應的邏輯。

function defineReactive(obj, key, val) {const dep = new Dep(); // 創建一個依賴收集器// 遞歸處理嵌套對象let childOb = observe(val);Object.defineProperty(obj, key, {enumerable: true,configurable: true,get() {// 添加依賴if (Dep.target) {dep.depend(); // 依賴收集if (childOb) {childOb.dep.depend(); // 處理數組的依賴}}return val;},set(newVal) {if (newVal === val) return;val = newVal;childOb = observe(newVal); // 處理新值的響應式dep.notify(); // 通知所有依賴更新}});
}
1.2 依賴收集

當組件渲染時,Vue 會將當前的渲染 watcher 作為 Dep.target 存儲。每當訪問一個響應式屬性時,getter 會被調用,依賴會被收集到 Dep 中。

1.3 觸發更新

當屬性的 setter 被調用時,Vue 會通知所有依賴于該屬性的 watcher 進行更新。這樣,視圖就會自動更新。

2. Vue 3.x 的響應式原理

在 Vue 3.x 中,Vue 使用 Proxy 來實現響應式,提供了更強大的功能和更好的性能。

2.1 使用 Proxy

Proxy 可以直接監聽對象的所有操作(如讀取、寫入、刪除等),而不需要逐個屬性地定義 getter 和 setter。

function reactive(target) {return new Proxy(target, {get(target, key, receiver) {// 依賴收集const res = Reflect.get(target, key, receiver);track(target, key); // 依賴收集return res;},set(target, key, value, receiver) {const oldValue = target[key];const result = Reflect.set(target, key, value, receiver);if (oldValue !== value) {trigger(target, key); // 觸發更新}return result;}});
}
2.2 依賴收集與觸發更新

在 Vue 3.x 中,依賴收集和觸發更新的邏輯被封裝在 tracktrigger 函數中。track 函數用于收集依賴,而 trigger 函數用于通知依賴更新。

3. 響應式系統的優缺點

優點
  • 自動更新:數據變化時,視圖會自動更新,減少了手動 DOM 操作的復雜性。
  • 高效:Vue 3.x 的 Proxy 實現比 Vue 2.x 的 Object.defineProperty 更高效,能夠處理更復雜的對象結構。
缺點
  • 性能開銷:在大量數據變化時,依賴收集和更新可能會帶來性能開銷。
  • 限制:Vue 2.x 中,Object.defineProperty 無法監聽數組的變化(如數組的索引和長度),而 Vue 3.x 的 Proxy 則可以更好地處理這些情況。

4. 總結

Vue 的響應式原理通過數據劫持和依賴收集,使得數據變化能夠自動反映到視圖上。Vue 2.x 使用 Object.defineProperty 實現響應式,而 Vue 3.x 則使用 Proxy,提供了更強大的功能和更好的性能。理解這些原理有助于更好地使用 Vue 進行開發,并優化應用的性能。

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

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

相關文章

【AI論文】PixNerd:像素神經場擴散

摘要:擴散變換器目前所取得的成功在很大程度上依賴于預訓練變分自編碼器(VAE)所塑造的壓縮潛在空間。然而,這種兩階段訓練模式不可避免地會引入累積誤差和解碼偽影。為解決上述問題,研究人員選擇回歸像素空間&#xff…

Java中的LambdaMetafactory:動態生成Lambda的底層黑魔法

引言 在Java 8中,Lambda表達式作為最引人注目的新特性之一被引入。但你是否曾好奇過,這些簡潔的Lambda表達式在底層是如何實現的?這就是LambdaMetafactory發揮作用的地方。作為Java語言中一個不太為人所知但極其重要的類,LambdaMe…

看不見的偽造痕跡:AI時代的鑒偽攻防戰

在生成式人工智能飛速發展的今天,“眼見為實”這句話的有效性正面臨前所未有的挑戰。以往,圖像篡改往往通過傳統的圖像處理工具(如 Photoshop)進行,需要較高的技術門檻和人工成本;而現在,僅需通…

《React+TypeScript實戰:前端狀態管理的安全架構與性能優化深解》

當用戶在界面上進行表單提交、數據篩選等操作時,每一次交互的精準響應,都依賴于底層狀態架構對風險的預判與性能的調控。深入理解如何在功能實現之外,構筑一套兼顧狀態安全與運行高效的體系,是從基礎開發邁向工程化實踐的關鍵一躍。狀態管理機制的設計,需要穿透“數據更新…

【android bluetooth 協議分析 01】【HCI 層介紹 30】【hci_event和le_meta_event如何上報到btu層】

一、引言 在藍牙協議棧中,HCI Event 和 LE Meta Event 是控制器(Controller)向主機(Host)報告事件的兩種形式,它們屬于 HCI(Host Controller Interface)層。這是主機和控制器之間通…

小實驗--震動點燈

1.實驗目的 使用中斷的方法,震動傳感器檢測到震動時,LED1點亮2秒,之后熄滅。 2.硬件清單 震動傳感器STM32開發板ST-Link 3.硬件連接STM32震動傳感器PA4DO3V3VCCGNDGND4.代碼 4.1exti.c #include "exti.h" #include "sys.h&quo…

vcpkg: 一款免費開源的C++包管理器

目錄 1.簡介 2.安裝 3.常用命令 4.與項目集成 5.vcpkg的工作原理 5.1.包索引:ports 系統(定義庫的 “元信息”) 5.2.源碼獲取:從 “地址” 到 “本地緩存” 5.3.編譯構建:按 “triplet” 定制目標 5.4.安裝布…

WinCC通過無線Modbus TCP監控S7-1200/200SMT PLC實例詳解

工業自動化系統中,車間內通常部署多臺PLC設備并需通過中央監控平臺實現集中管控。考慮到工業現場設備間距普遍在數十至數百米范圍,傳統有線以太網雖能保障傳輸速率,但其施工需面臨電纜溝開挖或復雜布線工程,既增加線材采購、人力投…

【AI智能編程】Trae-IDE工具學習

什么是Trae? Trae與 AI 深度集成,提供智能問答、代碼自動補全以及基于 Agent 的 AI 自動編程能力。使用 Trae 開發項目時,你可以與 AI 靈活協作,提升開發效率。提供傳統的 IDE 功能,包括代碼編寫、項目管理、插件管理…

智能駕駛再提速!批量蘇州金龍L4級自動駕駛巴士交付杭州臨平區

近日,由蘇州金龍海格客車研發的“清源”L4級自動駕駛巴士現身杭州市臨平區并投入測試。這是臨平區引進的首批L4級自動駕駛巴士,標志著臨平區智能交通建設邁入新階段。此次投入測試的“清源”小巴采用一級踏步設計,車身延續了海格蔚藍巴士的經…

Spring_事務

在mysql階段的文章中,已經介紹過事務了。本篇文章是對mysql事務的總結和對使用Spring框架來實現事務操作的講解。事務回顧什么是事務事務時一組操作的集合,是一個不可分割的操作。事務會把所有操作作為一個整體,一起向數據庫提交或者撤銷操作…

事務管理介紹

為什么要用事務管理在我們同時操作兩個或更多個數據庫時,可能因為網絡等各方面原因導致中間出現異常。造成像對第一個數據庫的操作成功了,但是對第二個數據庫的操作沒有成功。這樣數據的完整性就被破壞了。事務:是一組操作的集合,…

Android 之 ViewBinding 實現更安全、高效的視圖綁定

??一、配置說明????作用位置??需在模塊級 build.gradle或 build.gradle.kts文件的 android {}塊內添加:android {buildFeatures {viewBinding true // Kotlin DSL 語法} }android {buildFeatures {viewBinding true // Groovy 語法} }??生成規則??為每…

全球首款Java專用AI開發助手實測:一句話生成完整工程代碼——飛算 JavaAI

🌟 嗨,我是Lethehong!🌟🌍 立志在堅不欲說,成功在久不在速🌍🚀 歡迎關注:👍點贊??留言收藏🚀🍀歡迎使用:小智初學計算機…

Shader開發(七)創建第一個Shader項目

在前面的章節中,我們已經了解了Shader的基本概念和渲染管線的工作原理。現在,是時候動手實踐了!本章將帶您一步步創建第一個Shader項目,開啟真正的Shader開發之旅。 為什么選擇openFrameworks? 與其他文章不同&#x…

IAR軟件中測量函數執行時間

通常在調試代碼中需要直到某個函數或者某段代碼的實際執行時間,在IAR中可以直接借助軟件提供的工具來計算代碼執行時間。 第一種方法 進入仿真調試界面,在需要測量的代碼前面打斷點。工具欄中選擇 ST-LINK — Data Log Summary在 Data Log Summary 窗口中…

Java 字節碼文件(.class)的組成詳解

文章目錄基礎信息常量池字段方法屬性字節碼文件內容說明案例文件基本信息類的基本信息常量池字段信息構造方法實例方法主方法源文件信息字節碼文件由五部分組成,分別是基礎信息、常量池、字段、方法、屬性。案例: public class Main implements Interfa…

C++之vector類的代碼及其邏輯詳解 (下)

1. insert()這個就是在指定位置插入一個元素,首先計算要插入的這個位置和開頭之間的距離,接著判斷那個_finish 有沒有碰到_endofstorage 或者_endofstorage 是不是為0,如果滿足條件,那就進行擴容,然后接著重新計算距離…

【自動化測試】Python Selenium 自動化測試元素定位專業教程

1. 引言:元素定位在 Selenium 中的核心地位 元素定位是 Selenium 自動化測試的基礎,所有用戶交互操作(如點擊、輸入、選擇)都依賴于準確識別頁面元素。Selenium WebDriver 提供了多種定位策略,從簡單的 ID 定位到復雜…

通用代碼自用

多文件上傳public int save(Role role, RequestParam("nfile") MultipartFile nfile, HttpServletRequest request) {System.out.println(nfile.getOriginalFilename());String path request.getSession().getServletContext().getRealPath("/upload");Fi…