vue是如何監聽對象和數組變化的

Vue框架通過其響應式系統來監聽對象和數組的變化。這個系統的核心在于追蹤依賴關系,并在數據變化時通知所有依賴于該數據的觀察者。

?

1. 對象監聽

Vue使用`Object.defineProperty`方法來劫持各個屬性的getter和setter。當組件中的數據被讀取時,會觸發getter函數,在getter函數內部進行依賴收集;當數據被修改時,setter函數會被觸發,進而通知所有依賴于該屬性的觀察者進行更新。這種方式使得Vue可以精確地跟蹤每個屬性的變化,并進行高效的更新,還可以使用Object.assign()直接賦值來替換整個對象,可以觸發視圖更新。

2. 數組監聽

由于JavaScript的原生數組方法(如`push`、`pop`、`splice`等)不會觸發`Object.defineProperty`中的setter,Vue對數組的原生方法進行了重寫,使其也可以觸發視圖更新。另外,Vue還提供了`Vue.set`方法或`Array.prototype.splice`來確保新增的元素也是響應式的。對于刪除操作,Vue會通過索引跟蹤依賴,確保刪除操作能夠被監聽到。

3. 依賴收集

在組件渲染過程中,如果一個數據被讀取,那么這個數據就會被添加到這個組件的依賴列表中。當數據發生變化時,Vue會遍歷這個依賴列表,并通知所有依賴這個數據的部分進行更新。

4. Watcher

Vue的內部機制創建了Watcher對象,這些對象負責追蹤自己依賴的數據,并在數據變化時執行回調函數以更新視圖。每個組件實例都有一個Watcher實例與之對應,用于監聽該組件模板所依賴的數據。

5. 異步隊列

為了優化性能,Vue還會將這些更新放入一個異步隊列,然后使用`nextTick`方法將這些更新在下一個DOM循環中一次性應用,這樣可以減少不必要的DOM操作,提高渲染效率。

6. 虛擬DOM(VDOM)

Vue使用虛擬DOM來表示真實的DOM結構,當監聽到數據變化時,Vue會生成新的虛擬節點與老的虛擬節點進行比較,然后通過一個diff算法計算出最小的變更步驟來更新真實的DOM。

?

總結來說,Vue通過定義屬性的getter和setter以及重寫數組方法來監聽對象和數組的變化。當數據變化被監聽到后,Vue通過內部的Watcher機制和虛擬DOM技術來確保視圖能夠高效且準確地更新。


在 Vue2 中,響應式原理**基于 Object.defineProperty** 實現,而在 Vue3 中,響應式原理是**通過 Proxy 對象實現的**。

Vue2 的響應式原理利用了 JavaScript 中的 `Object.defineProperty` 方法。此方法允許開發者定義對象屬性的 getter 和 setter,使得當這些屬性被讀取或賦值時,可以執行自定義的操作。Vue2 在初始化過程中會遍歷 data 對象的所有屬性,為每個屬性設置 getter 和 setter,同時收集依賴(即哪些地方使用了這個屬性),并在屬性值改變時通知這些依賴進行更新。

Vue3 則采用了 ES6 的 `Proxy` 對象來實現響應式。`Proxy` 可以代理對象的全部屬性,并且能夠輕松地對新增或刪除的屬性進行處理。與 `Object.defineProperty` 相比,它能夠在更多操作(如數組索引的變更)上提供攔截能力。Vue3 結合了 `Reflect` 來確保 `Proxy` 處理中的一致性和正確性。

兩者的主要區別在于:

1. **監聽方式**:Vue2 使用的是屬性級別的監聽,而 Vue3 實現了對象級別的全局監聽。
2. **新增和刪除屬性**:Vue2 對于對象新增或刪除的屬性無法做出響應式處理,除非使用特定的 API 方法;Vue3 由于使用了 Proxy,能夠自然地處理這種情況。
3. **性能**:在 Vue2 中,由于需要遞歸遍歷所有屬性,在處理具有大量屬性的對象時可能會有性能損耗。而 Vue3 通過 Proxy 避免了這種遞歸過程,提高了性能。

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

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

相關文章

ROS2服務通信的實現

文章目錄 1.服務通信的概念及應用場景1.1概念1.2 應用場景 2.準備工作3.服務通信的實現3.1 服務通信接口消息3.2 服務端實現3.3 客戶端實現3.4 編譯及運行3.4.1 修改CMakeLists3.4.2 服務端運行結果3.4.2 客戶端運行結果 1.服務通信的概念及應用場景 1.1概念 服務通信也是ROS…

抖店0元入駐不交錢會怎么樣?個人店和個體店的利弊分析,開店必看

我是王路飛。 現在的抖店是可以開通個人店的。 也就是不需要營業執照、直接使用個人身份證就可以在抖音開店,而且也不需要繳納店鋪保證金就能開店運營了。 但真實情況是怎么樣的呢?新手0元入駐抖店不交這個保證金會怎么樣呢? 今天給想在抖…

AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境應用

原文鏈接:AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境應用 一開啟大模型 1 開啟大模型 1)大模型的發展歷程與最新功能 2)大模型的強大功能與應用場景 3)國內外經典大模型(ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diff…

ios App 發送廣播失敗解決

記錄開發 ios App 使用 c 混編時遇到的問題: 開發環境 macOS Sonoma(最新版本14.3.1) Xcode Version 15.2 ipadOS(最新版本17.3.1) 問題:在mac 上 和 ipad上測試,當 udp 發送廣播&#xff…

跨域引起的兩個接口的session_id不是同一個

來源場景: RequestMapping(“/captcha”)接口設置了SESSION_KEY,也能獲取到,但是到了PostMapping(“/login”)接口就是空的,由于跨域導致的兩個session_id不是同一個 /*** 系統用戶 前端控制器*/ Controller CrossOrigin(origins…

【數據結構和算法初階(C語言)】雙向循環帶頭鏈表的增刪查改詳解(天才設計的鏈表結構,應用簡單逆天!!!!!)

目錄 ?編輯?編輯 1.雙向鏈表的定義:前赴后繼 2.帶頭鏈表的定義-----哨兵位 3.增刪查改 3.1創建新節點函數----方便后續增加節點調用 3.2創建哨兵位----創建頭結點 3.3增加節點,尾部插入數據 3.4尾刪除 3.5查找函數----遍歷對比&#xff…

AcWing 562.壁畫

咱先看一眼算法標簽,發現是思維題、枚舉、前綴和 Buttt其實我們根據上訴的樣例解釋部分就會發現,其實這就是一個長度為?n/2?(向上取整哦)的連續子數組的最大和。 這題我也用暴力法試過啦,很明顯會TLE 如果你對dp題…

Mac M系列芯片如何重新安裝系統

使用可引導安裝器重新安裝(可用于安裝非最新的 Mac OS,系統降級,需要清除所有數據,過程確保連接上網絡,雖然這種方式不會下載 Mac OS,但是需要下載固件等信息) 插入制作好的可引導安裝器&#x…

【使用imgaug庫調整圖像大小并修改對應的XML標簽框】

使用imgaug庫可以方便地進行圖像增強操作,包括調整圖像大小。以下是使用imgaug庫調整圖像大小并修改對應的XML標簽框的示例腳本: 注意修改輸入文件夾路徑、輸出文件夾路徑和目標尺寸為自己內容。 input_folder "path/to/your/input_folder" …

kalibr標定ZED2i雙目加imu

一、錄制bag 本人使用的zed2i相機。 rosbag record -O 32 /zed2i/zed_node/imu/data /zed2i/zed_node/imdata_raw /zed2i/zed_node/left/image_rect_color /zed2i/zed_node/right/image_rect_color /zed2i/zed_node/left_raw/image_raw_color /zed2i/zed_node/right_raw/ima…

Matlab|【免費】基于合作博弈的綜合能源系統利益分配優化調度

目錄 主要內容 部分代碼 結果一覽 下載鏈接 主要內容 該程序實現的模型為綜合能源系統利益分配優化調度,采用合作博弈方法,模型針對IES系統的P2G、電解槽、甲烷反應器、儲氫罐、CHP和燃氣鍋爐等設備進行建模,實現基于合作博弈的…

std::shared_from_this注意事項:exception bad_weak_ptr

1.不可以在構造函數中調用shared_from_this() 因為它的實現是&#xff1a; _LIBCPP_INLINE_VISIBILITYshared_ptr<_Tp> shared_from_this(){return shared_ptr<_Tp>(__weak_this_);}也就是它依賴的__weak_this_此時還未創建完成。 2.一定要public繼承 class MyTy…

大數據開發(Java面試真題-卷二)

大數據開發&#xff08;Java面試真題&#xff09; 1、請簡要說明Java中equeals()和hashCode()的作用及區別&#xff1f;2、Java中的四種訪問修飾符及它們之間的區別&#xff1f;3、請解釋Java中的異常處理機制&#xff0c;包括checked exception和unchecked exception?4、Java…

Linux 學習筆記(10)

十、 進程管理 進程就是運行中的程序&#xff0c;一個運行著的程序&#xff0c;可能有多個進程。 比如 LinuxSir.Org 所用的 WWW 服務器是 apache 服務器&#xff0c;當管理員啟動服務后&#xff0c;可能會有好多人來訪問&#xff0c;也就是說許多用戶來同時請 求 htt…

QT debug編譯失敗:xxx/bin/ld.exe: cannot find -lxxd1

原因&#xff1a;由于編譯時&#xff0c;使用debug模式下&#xff0c;動態庫沒有對應的lxxd1中的xx庫 解決方案1&#xff1a;改為release編譯&#xff1b; 解決方案2&#xff1a;在引用的三方pri文件中&#xff0c;去掉多余的d #修改前 if(!debug_and_release|build_pass):CON…

沃德的背包

題目描述 沃德進入源碼世界的路上有很多寶石&#xff0c;可是沃德的背包只能背總重量不超過m的寶石&#xff0c;路上一共有n個寶石&#xff0c;每個寶石的重量為wi&#xff0c;請你幫沃德選擇盡量多的寶石裝進背包&#xff0c;請注意寶石的總重量不超過m。 輸入描述 第一行輸…

Django官網項目 二

官網地址&#xff1a;Writing your first Django app, part 2 | Django documentation | Django 創建模組&#xff1a; 注冊model &#xff08;bug&#xff1a;沒有加后面的逗號&#xff09; 在manage.py 的目錄下&#xff1a; python manage.py makemigrations polls pyth…

redis09 集群(cluster)

思維草圖 為什么要使用集群 單臺redis內存容量的限制單臺redis并發寫量太大有性能瓶頸 redis集群認識 redis集群是對redis的水平擴容&#xff0c;即啟動N個redis節點&#xff0c;將整個數據分布存儲在這個N個節點中&#xff0c;每個節點存儲總數據的1/N。 如下圖&#xff1…

C++ 根據公式計算橢圓任意點到中心的距離

#include <iostream> using namespace std;double fact(int x) //定義階乘函數。注意是double類型 {double y x; //注意是double類型for (int i x-1; i > 0; i--)y * i;return y; };double My_sin(int x) //定義sin函數。注意是double類型 {double y 0; //注意是do…

【視頻圖像取證篇】Amped FIVE專業法醫圖像和視頻增強軟件之模糊圖像去隔行功能

【視頻圖像取證篇】Amped FIVE專業法醫圖像和視頻增強軟件之模糊圖像去隔行功能 法醫圖像和視頻增強軟件&#xff0c;專業又強大&#xff01;&#xff01;&#xff01;超過 140 種過濾器和工具&#xff0c;用于分析、恢復和增強數字圖像和視頻。Amped FIVE能夠穩定抖動的視頻&…