前端面試題(八):簡述Vue2的響應式原理

Vue 2 的響應式原理主要基于 數據劫持發布-訂閱模式,通過 Object.defineProperty 對對象的屬性進行攔截,實現數據的監控與視圖更新。具體原理如下:

1. 數據劫持:Object.defineProperty

Vue 2 在初始化過程中,通過 Object.defineProperty 給對象的每一個屬性添加 gettersetter,來劫持數據的訪問和修改。

  • getter: 當訪問該屬性時,Vue 會觸發 getter,在這個過程中 Vue 會將當前的 watcher(即視圖中的依賴)收集到該屬性的依賴列表中。這樣,當該屬性發生變化時,相關的視圖就能知道并做出更新。
  • setter: 當修改該屬性的值時,Vue 會觸發 setter,然后觸發依賴更新(通過通知 watcher 進行視圖的重新渲染)。

2. 依賴收集:DepWatcher

Vue 2 中使用了 DepWatcher 對象來實現依賴收集和視圖更新:

  • Dep: 每個數據屬性(通過 Object.defineProperty 劫持的屬性)都會有一個對應的 Dep 對象,負責管理該屬性的所有依賴(即需要觀察該屬性的視圖、計算屬性等)。當該數據發生變化時,Dep 會通知所有依賴該屬性的 watcher 進行更新。

  • Watcher: 在 Vue 組件中,每個組件實例都對應著一個 Watcher,它會監聽模板中使用到的響應式數據。Watcher 會在數據發生變化時進行相應的視圖更新。

3. 發布-訂閱模式

  • 發布者: 數據對象通過 Object.defineProperty 攔截屬性的訪問和修改,作為發布者。
  • 訂閱者: 視圖(watcher)和計算屬性等是訂閱者,它們會在數據變化時進行相應的更新。通過 Dep,每當數據發生變化時,Dep 會通知所有相關的 watcher,從而觸發視圖更新。

4. 視圖更新

當數據發生變化時,setter 會觸發 Dep 的通知機制,Dep 會遍歷所有依賴它的 watcher,然后更新視圖。Vue 會通過 虛擬 DOM 比對前后差異(即 diff 算法),然后將差異應用到實際的 DOM 上,從而實現視圖的更新。

總結

  • Vue 2 通過 Object.defineProperty 劫持數據的 gettersetter,來監聽數據的訪問和修改。
  • 使用 DepWatcher 實現 依賴收集視圖更新
  • 視圖變化時,watcher 觸發更新,通過 虛擬 DOMdiff 算法 優化性能,最終更新真實 DOM。

Vue 2 的響應式系統基于數據劫持和發布-訂閱模式,提供了數據和視圖的雙向綁定機制,簡化了開發過程中的 DOM 操作。

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

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

相關文章

深度學習中的數值穩定性處理詳解:以SimCLR損失為例

文章目錄 1. 問題背景SimCLR的原始公式 2. 數值溢出問題為什么會出現數值溢出?浮點數的表示范圍 3. 數值穩定性處理方法核心思想數學推導 4. 代碼實現分解代碼與公式的對應關系 5. 具體數值示例示例:相似度矩陣方法1:直接計算exp(x)方法2&…

SQL(9):創建數據庫,表,簡單

1、創建數據庫,一句SQL語句搞定 CREATE DATDBASE 數據庫名 CREATE DATABASE my_db;2、創建表 CREATE TABLE 表名(字段名 類型) CREATE TABLE Persons ( PersonID int, LastName varchar(255), FirstName varchar(255), Address varchar(255), City varchar(255)…

QT Sqlite數據庫-教程002 查詢數據-下

【1】數據庫查詢的優化:prepare prepare語句是一種在執行之前將SQL語句編譯為字節碼的機制,可以提高執行效率并防止SQL注入攻擊。 【2】使用prepare查詢一張表 QString myTable "myTable" ; QString cmd QString("SELECT * FROM %1…

cline 提示詞工程指南-架構篇

cline 提示詞工程指南-架構篇 本篇是 cline 提示詞工程指南的學習和擴展,可以參閱: https://docs.cline.bot/improving-your-prompting-skills/prompting 前言 cline 是 vscode 的插件,用來在 vscode 里實現 ai 編程。 它使得你可以接入…

算法---子序列[動態規劃解決](最長遞增子序列)

最長遞增子序列 子序列包含子數組&#xff01; 說白了&#xff0c;要用到雙層循環&#xff01; 用雙層循環中的dp[i]和dp[j]把所有子序列情況考慮到位 class Solution { public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);for(int i …

kubectl命令補全以及oc命令補全

kubectl命令補全 1.安裝bash-completion 如果你用的是Bash(默認情況下是)&#xff0c;先安裝補全功能支持包 sudo apt update sudo apt install bash-completion -y2.為kubectl 啟用補全功能 會話中臨時&#xff1a; source <(kubectl completion bash)持久化配置&#x…

48、Spring Boot 詳細講義(五)

3、集成MyBatis 3.1 MyBatis 概述 3.1.1 核心功能和優勢 MyBatis 是一個 Java 持久層框架,它通過 XML 或注解配置 SQL 語句,將 Java 方法與 SQL 語句映射起來,消除了大量的 JDBC 代碼,簡化了數據庫操作。MyBatis 的核心功能和優勢包括: ORM(對象關系映射):通過 XML …

BERT - Bert模型框架復現

本節將實現一個基于Transformer架構的BERT模型。 1. MultiHeadAttention 類 這個類實現了多頭自注意力機制&#xff08;Multi-Head Self-Attention&#xff09;&#xff0c;是Transformer架構的核心部分。 在前幾篇文章中均有講解&#xff0c;直接上代碼 class MultiHeadAtt…

解決 Spring Boot 啟動報錯:數據源配置引發的啟動失敗

啟動項目時&#xff0c;控制臺輸出了如下錯誤信息&#xff1a; Error starting ApplicationContext. To display the condition evaluation report re-run your application with debug enabled. 2025-04-14 21:13:33.005 [main] ERROR o.s.b.d.LoggingFailureAnalysisReporte…

履帶小車+六軸機械臂(2)

本次介紹原理圖部分 開發板部分&#xff0c;電源供電部分&#xff0c;六路舵機&#xff0c;PS2手柄接收器&#xff0c;HC-05藍牙模塊&#xff0c;蜂鳴器&#xff0c;串口&#xff0c;TB6612電機驅動模塊&#xff0c;LDO線性穩壓電路&#xff0c;按鍵部分 1、開發板部分 需要注…

【開發記錄】服務外包大賽記錄

參加服務外包大賽的A07賽道中&#xff0c;最近因為頻繁的DEBUG&#xff0c;心態爆炸 記錄錯誤 以防止再次出現錯誤浪費時間。。。 2025.4.13 項目在上傳圖片之后 會自動刷新 沒有等待后端返回 Network中的fetch /upload顯示canceled. 然而這是使用了VS的live Server插件才這樣&…

基于FreeRTOS和LVGL的多功能低功耗智能手表(硬件篇)

目錄 一、簡介 二、板子構成 三、核心板 3.1 MCU最小系統板電路 3.2 電源電路 3.3 LCD電路 3.4 EEPROM電路 3.5 硬件看門狗電路 四、背板 4.1 傳感器電路 4.2 充電盤 4.3 藍牙模塊電路 五、總結 一、簡介 本篇開始介紹這個項目的硬件部分&#xff0c;從最小電路設…

為 Kubernetes 提供智能的 LLM 推理路由:Gateway API Inference Extension 深度解析

現代生成式 AI 和大語言模型&#xff08;LLM&#xff09;服務給 Kubernetes 帶來了獨特的流量路由挑戰。與典型的短時、無狀態 Web 請求不同&#xff0c;LLM 推理會話通常是長時運行、資源密集且部分有狀態的。例如&#xff0c;一個基于 GPU 的模型服務器可能同時維護多個活躍的…

MacOs下解決遠程終端內容復制并到本地粘貼板

常常需要在服務器上搗鼓東西&#xff0c;同時需要將內容復制到本地的需求。 1-內容是在遠程終端用vim打開&#xff0c;如何用vim的類似指令達到快速復制到本地呢&#xff1f; 假設待復制的內容&#xff1a; #include <iostream> #include <cstring> using names…

STM32 vs ESP32:如何選擇最適合你的單片機?

引言 在嵌入式開發中&#xff0c;STM32 和 ESP32 是兩種最熱門的微控制器方案。但許多開發者面對項目選型時仍會感到困惑&#xff1a;到底是選擇功能強大的 STM32&#xff0c;還是集成無線的 ESP32&#xff1f; 本文將通過 硬件資源、開發場景、成本分析 等多維度對比&#xf…

【blender小技巧】Blender導出帶貼圖的FBX模型,并在unity中提取材質模型使用

前言 這其實是我之前做過的操作&#xff0c;我只是單獨提取出來了而已。感興趣可以去看看&#xff1a;【blender小技巧】使用Blender將VRM或者其他模型轉化為FBX模型&#xff0c;并在unity使用&#xff0c;導出帶貼圖的FBX模型&#xff0c;貼圖材質問題修復 一、導出帶貼圖的…

如何保證本地緩存和redis的一致性

1. Cache Aside Pattern&#xff08;旁路緩存模式&#xff09;?? ?核心思想?&#xff1a;應用代碼直接管理緩存與數據的同步&#xff0c;分為讀寫兩個流程&#xff1a; ?讀取數據?&#xff1a; 先查本地緩存&#xff08;如 Guava Cache&#xff09;。若本地未命中&…

k8s通過service標簽實現藍綠發布

k8s通過service標簽實現藍綠發布 通過k8s service label標簽實現藍綠發布方法1:使用kubelet完成藍綠切換1. 創建綠色版本1.1 創建綠色版本 Deployment1.2 創建綠色版本 Service 2. 創建藍色版本2.1 創建藍色版本 Deployment2.2 創建藍色版本 Service 3. 創建藍綠切換SVC (用于外…

智慧酒店企業站官網-前端靜態網站模板【前端練習項目】

最近又寫了一個靜態網站&#xff0c;智慧酒店宣傳官網。 使用的技術 html css js 。 特別適合編程學習者進行網頁制作和前端開發的實踐。 項目包含七個核心模塊&#xff1a;首頁、整體解決方案、優勢、全國案例、行業觀點、合作加盟、關于我們。 通過該項目&#xff0c;小伙伴們…

Epplus 8+ 許可證設置

Epplus 8 之后非商業許可證的設置變了如果還用普通的方法會報錯 Unhandled exception. OfficeOpenXml.LicenseContextPropertyObsoleteException: Please use the static ‘ExcelPackage.License’ property to set the required license information from EPPlus 8 and later …