vue響應式原理——vue2和vue3的響應式實現區別

? ? ? ? Vue的核心功能點之一是響應式:Vue 會自動跟蹤 JavaScript 狀態并在其發生變化時響應式地更新 DOM。

? ? ? ? 簡單的來說就是,頁面的渲染效果會隨著數據變化而變化,不用我們去手動操作DOM樹進行數據變化后的渲染。為了實現這一目的,我們最簡單的實現思路就是去監聽每一個對象中的值,在我們獲取或者更新這個值是插上一腳來操作DOM,此時,就可以通過函數去操作這個對象,以達到我們的目的。

vue2的響應式實現方法:defineProperty

? ? ? ? Object.defineProperty() 是 JavaScript 中的一個方法,用于直接在一個對象上定義一個新屬性,或者修改一個已經存在的屬性。它提供了精細的控制能力,可以定義屬性的特性(特性包括可枚舉、可配置、可寫性等),并可以定義 getter 和 setter,在屬性被訪問或者設置時執行自定義的行為。

? ? ? ? 這里vue2的思路則為通過該方法來遍歷對象,達到監聽對象屬性的目的,代碼如下:

const obj = {a: 1,b: 2,c: {d: 3,e: 4,}
} as any//觀察
const observer = (obj: any) => {for (const key in obj) {let temp = obj[key]if (typeof obj[key] === 'object') {observer(obj[key])} else {Object.defineProperty(obj, key, {get() {console.log('讀取', key)return temp},set(val) {console.log('修改', key)temp = val}})}}
}observer(obj)obj.a;// 讀取 a
obj.b = 3; // 修改 b
obj.c.d; // 讀取 c.dobj.f = 5 // 新添屬性 f 并修改 f

輸出結果:

?

? ? ? ? 這里我們可以發現, 我們用遞歸的方式來去對每個值進行了監聽,但是對應后面新增的對象屬性就沒有相對性的監聽效果,如果想進行監聽,就需要對這個屬性進行單獨的處理:

const obj = {a: 1,b: 2,c: {d: 3,e: 4,}
} as any//觀察
const observer = (obj: any) => {for (const key in obj) {let temp = obj[key]if (typeof obj[key] === 'object') {observer(obj[key])} else {Object.defineProperty(obj, key, {get() {console.log('讀取', key)return temp},set(val) {console.log('修改', key)temp = val}})}}
}const set = (obj: any, key: string, value: any) => {obj[key] = valuelet temp = obj[key]if (typeof value === 'object') {observer(value)} else {Object.defineProperty(obj, key, {get() {console.log('讀取', key)return temp},set(val) {console.log('修改', key)temp = val}})}
}observer(obj)obj.a;// 讀取 a
obj.b = 3; // 修改 b
obj.c.d; // 讀取 c.dset(obj, 'f', {g: 5
}) // 修改 fobj.f.g; // 讀取 f

輸出結果:

?vue3的響應式實現方法:Proxy

? ? ? ? Proxy 是 ES6 中新增的一個功能,它允許你在訪問一個對象之前定義自定義行為。通過 Proxy,你可以創建一個代理對象來包裹目標對象,并可以攔截并重定義該對象的各種操作,如屬性的讀取、賦值、刪除等操作,甚至可以自定義對象的行為。

? ? ? ?vue3使用的是Proxy來進行響應式操作的,這里就沒必要將對象的所有屬性進行遍歷,而是使用哪個屬性,則對哪個屬性進行監聽:

const obj ={a: 1,b: 2,c: {d: 3,e: 4,}
} as anyconst option = {get(target: any, key: any) {console.log('讀取', key)//判斷是否是對象if (typeof target[key] === 'object') {return new Proxy(target[key], option)}return target[key]},set(target: any, key: any, value: any) {console.log('設置', key, value)//判斷是否是對象if (typeof value === 'object') {target[key] = new Proxy(value, option)return true}return true},
}const proxy = new Proxy(obj, option)proxy.a = 10; // 設置 a 10
proxy.a; // 讀取 aproxy.c.f = 20; // 設置 c.f 20
proxy.c.f; // 讀取 c.fproxy.c; // 讀取 c

輸出結果:

總結

? ? ? ? vue2和vue3的響應式操作相比,vue2需要遍歷對象,且對于新的屬性無法直接進行監聽,而vue3使用代理對象就不會出現這個問題。

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

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

相關文章

Kaamel白皮書:2025版COPPA落地實操指南

COPPA簡介 《兒童在線隱私保護法案》(COPPA)于1998年在美國頒布,其最初的動因源于人們日益增長的對互聯網上收集兒童個人信息的擔憂。為了響應這一問題,聯邦貿易委員會(FTC)被授權制定并執行相關法規。COP…

測試基礎筆記第十四天

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 一、字符串1.字符串2.字符串切片3.查找find()4.去除兩端空白字符 strip5.字符串轉換大小寫 lower、upper5.拆分 split()6.字符串的其他常見方…

什么是Lua模塊?你會如何使用NGINX的Lua模塊來定制請求處理流程?

大家好,我是鋒哥。今天分享關于【什么是Lua模塊?你會如何使用NGINX的Lua模塊來定制請求處理流程?】面試題。希望對大家有幫助; 什么是Lua模塊?你會如何使用NGINX的Lua模塊來定制請求處理流程? 1000道 互聯…

ubuntu擴展邏輯卷并調整文件系統大小步驟

安裝好ubuntu如果沒有調整磁盤空間,一般默認給你100G的空間,在用完時再調整也還來得及,下面是 ubuntu擴展邏輯卷并調整文件系統大小步驟: 1. 擴展邏輯卷 運行以下命令來擴展邏輯卷 /dev/ubuntu-vg/ubuntu-lv,使其使用卷組中所有未分配的空間&#xff…

復雜背景下無人機影像小目標檢測:MPE-YOLO抗遮擋與抗背景干擾設計

目錄 一、引言 二、挑戰和貢獻 密集小目標和遮擋 實時性要求與精度權衡 復雜背景 三、MPE-YOLO模型細節 多級特征集成器(MFI) 感知增強卷積(PEC) 增強范圍C2f模塊(ES-C2f) 四、Coovally AI模型訓…

【C++】13.list的模擬實現

首先,我們需要把鏈表管理起來,也就是把一個個節點管理起來,但是每個節點的信息我們也需要管理,例如節點的前驅指針和后驅指針,以及節點的值,所以我們這里先封裝兩個類來管理節點和鏈表。 namespace Ro {te…

TinyVue v3.22.0 正式發布:深色模式上線!集成 UnoCSS 圖標庫!TypeScript 類型支持全面升級!

我們非常高興地宣布,2025年4月7日,TinyVue發布了v3.22.0🎉。 本次 3.22.0 版本主要有以下重大變更: 支持深色模式增加基于 UnoCSS 的圖標庫更豐富的 TypeScript 類型聲明支持 XSS 配置 詳細的 Release Notes 請參考&#xff1a…

超級創新思路:基于CBAM-Transformer的強化學習時間序列預測模型(Python\matlab實現)

首先聲明,該模型為原創!原創!原創!且該思路還未有成果發表,感興趣的小伙伴可以借鑒!需要完整代碼可私信或評論! 本方案可用于醫療、金融、交通、零售、光伏功率預測、估計預測、天氣預測、流量預測、故障檢測等領域! 目錄 首先聲明,該模型為原創!原創!原創!且該思…

Apache Sqoop數據采集問題

Sqoop數據采集格式問題 一、Sqoop工作原理二、Sqoop命令格式三、Oracle數據采集格式問題四、Sqoop增量采集方案 Apache Sqoop是一款開源的工具,主要用于在Hadoop(Hive)與傳統的數據庫(mysql、postgresql…)間進行數據的傳遞,可以將一個關系型數據庫&…

Grok發布了Grok Studio 和 Workspaces兩個強大的功能。該如何使用?如何使用Grok3 API?

最近Grok又更新了幾個功能:Grok Studio 和 Workspaces。 其中 Grok Studio 主要功能包括: 代碼執行:在預覽標簽中運行 HTML 片段、Python、JavaScript 等。 Google Drive 集成:附加并處理 Docs、Sheets、Slides等文件。 協作工…

Vue選項式 API 與組合式 API

選項式 API 與組合式 API 選項式 API 選項式 API 是 Vue 2 中常用的開發方式&#xff0c;在 Vue 3 里依舊得到支持。它把組件邏輯劃分為不同的選項&#xff0c;像 data、methods、computed 等。 <template><div><p>Count: {{ count }}</p><button…

SiamMask中的分類分支、回歸分支與Mask分支,有何本質差異?

SiamMask中的分類分支、回歸分支與Mask分支&#xff0c;有何本質差異&#xff1f; 一、引言二、分支定位與任務目標三、網絡結構與感受野設計3.1 分類分支&#xff08;Classification Head&#xff09;3.2 回歸分支&#xff08;Regression Head&#xff09;3.3 Mask分支&#x…

threejs學習day02

場景、相機、渲染器 一、創建3D場景 // 引入threejs import * as THREE from three// 創建一個三維場景scene const scene new THREE.Scene();// 給三維場景添加物品 const geometry new THREE.BoxGeometry(100,100,100) // 形狀 const meterial new THREE.MeshBasicMat…

K8S Pod 常見數據存儲方案

假設有如下三個節點的 K8S 集群&#xff1a; k8s31master 是控制節點 k8s31node1、k8s31node2 是工作節點 容器運行時是 containerd 一、理論介紹 1.1、Volumes 卷 Kubernetes 的卷是 pod 的?個組成部分&#xff0c;因此像容器?樣在 pod 的規范&#xff08;pod.spec&#x…

【MySQL數據庫】函數操作

目錄 1&#xff0c;日期函數 2&#xff0c;字符串函數 3&#xff0c;數學函數 1&#xff0c;日期函數 樣例&#xff1a; 獲得年月日 select current_date(); 獲取時分秒 select current_time(); 獲得時間戳 select current_timestamp(); 在日期的基礎上加日期 在2025年4月27…

【每日隨筆】文化屬性 ① ( 天機 | 強勢文化與弱勢文化 | 文化屬性的形成與改變 | 強勢文化 具備的特點 )

文章目錄 一、文化屬性1、天機2、文化屬性的強勢文化與弱勢文化強勢文化弱勢文化 二、文化屬性的形成與改變1、文化屬性形成2、文化屬性改變3、文化知識的階層 三、強勢文化 具備的 特點 一、文化屬性 1、天機 如果想要 了解這個世界的 底層架構 , 就需要掌握 洞察事物本質 的能…

【Fifty Project - D18】

感覺自己就不是計劃星球人&#xff0c;雖然fifty project要求每天早上完成一天的計劃&#xff0c;但是對于一個p人腦子&#xff0c;強制自己按照計劃行事真的太難了。我也理解在早晨花費時間做好一天的計劃有很多好處&#xff0c;但是實際行動起來完成率極低。p人的世界里變動太…

Linux系統編程 day11 鎖 (兩天沒有更新了,中期完就休息了)

鎖的注意事項 1、盡量保證鎖的粒度&#xff0c;越小越好。(訪問共享數據前&#xff0c;加鎖&#xff0c;訪問結束后立即解鎖) 2、互斥鎖&#xff0c;本質是結構體&#xff0c;但是可以看成整數&#xff0c;初值為1。(pthread_mutex_init調用成功) 3、加鎖&#xff1a; --操作…

【Maven】特殊pom.xml配置文件 - BOM

文章目錄 特殊pom.xml配置文件 - BOM一、例子二、注意事項1.特殊的子pom.xml文件2.dependencyManagement 特殊pom.xml配置文件 - BOM 僅用于集中管理項目依賴版本 在 Maven 中&#xff0c;BOM 用于定義一個項目的依賴版本的集合&#xff0c;通常用于管理一組共享的依賴版本。這…

《代碼整潔之道》第5章 格式 - 筆記

你應該選擇一套管理代碼格式的簡單規則。如果是團隊&#xff0c;應該選擇一套團隊一致同意采用的簡單格式規則。 最重要的原則&#xff1a;一致性&#xff08;Consistency&#xff09;&#xff01; 沒有完美的格式規范&#xff0c;但有統一的規范。 整個團隊&#xff08;或者…