Vue3源碼reactivity響應式篇之reactive響應式對象的track與trigger

概覽

BaseReactiveHandler類的get方法中,有如下代碼塊if (!isReadonly2){track(target, "get", key);},這表示通過reactiveshallowReactive創建的響應式對象,非只讀的,當讀取代理對象proxyTarget的某個屬性key時,都會被該get方法攔截,即調用track()方法建立依賴。

而當對代理對象proxyTarget進行賦值或更新某個屬性的值時,會被set方法攔截,即調用trigger()方法觸發依賴(而刪除會被deleteProperty攔截)。

因此對于reactive響應式對象的響應式處理,和tracktrigger方法密不可分。

本文主要介紹tracktrigger是如何進行依賴的收集與觸發的全流程。
在這里插入圖片描述

源碼分析

在vue3中,維護了一個全局的targetMap WeakMap實例對象,用于存儲響應式對象與依賴的映射關系。

const targetMap = new WeakMap();

track方法

track方法收集依賴就是往變量targetMap中添加相關元素,存儲響應式對象與依賴的映射關系。

track的源碼實現如下:

function track(target, type, key) {if (shouldTrack && activeSub) {let depsMap = targetMap.get(target);if (!depsMap) {targetMap.set(target, depsMap = new Map());}let dep = depsMap.get(key);if (!dep) {depsMap.set(key, dep = new Dep());dep.map = depsMap;dep.key = key;}dep.track();}
}

這里暫且不論shouldTrackactiveSub,假定滿足track的條件。首先從targetMap中讀取depsMap,若depsMap中不存在,則創建一個新的Map的實例,并將其賦值給depsMap,并且存儲到targetMap中。然后從depsMap中獲取key對應的依賴關系dep,同理,若dep不存在,則創建一個新的Dep實例,并將其賦值給dep,并且存儲到depsMap中,然后將depmapkey分別綁定depsMapkey。最后調用dep.track()方法。

dep.track()執行后,會將當前的activeSub添加到depsubs數組中。

trigger方法

track方法的源碼實現如下:

function trigger(target, type, key, newValue, oldValue, oldTarget) {const depsMap = targetMap.get(target);if (!depsMap) {globalVersion++;return;}const run = (dep) => {if (dep) {dep.trigger();}};startBatch();if (type === "clear") {depsMap.forEach(run);} else {const targetIsArray = isArray(target);const isArrayIndex = targetIsArray && isIntegerKey(key);if (targetIsArray && key === "length") {const newLength = Number(newValue);depsMap.forEach((dep, key2) => {if (key2 === "length" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {run(dep);}});} else {if (key !== void 0 || depsMap.has(void 0)) {run(depsMap.get(key));}if (isArrayIndex) {run(depsMap.get(ARRAY_ITERATE_KEY));}switch (type) {case "add":if (!targetIsArray) {run(depsMap.get(ITERATE_KEY));if (isMap(target)) {run(depsMap.get(MAP_KEY_ITERATE_KEY));}} else if (isArrayIndex) {run(depsMap.get("length"));}break;case "delete":if (!targetIsArray) {run(depsMap.get(ITERATE_KEY));if (isMap(target)) {run(depsMap.get(MAP_KEY_ITERATE_KEY));}}break;case "set":if (isMap(target)) {run(depsMap.get(ITERATE_KEY));}break;}}}endBatch();
}

trigger方法在響應式數據發生變化后會被觸發,vue3會先判斷全局響應式集合對象targetMap中是否存在依賴對象depsMap,即是否有被追蹤依賴,若不存在,則將globalVersion1,然后直接返回,沒有下一步;定義run方法;調用startBatch方法,表示要進行批處理。判斷type是否clear,是,則遍歷依賴對象depsMap,執行run方法;否則判斷target是否是數組,以及key是否數組的索引,然后根據typekey取出響應式數據對應的具體依賴,調用run方法;最后調用endBatch方法。

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

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

相關文章

VRRP 多節點工作原理

VRRP 多節點工作原理 基本概念 VRRP 的設計初衷是給一組節點提供一個 虛擬路由器,對外只表現出一個 VIP。協議規定:同一個 VRRP 實例 下始終只有 一個 Master 持有 VIP,其它全部是 Backup。 Master → 持有 VIP,負責轉發流量到Mas…

Gradio全解11——Streaming:流式傳輸的視頻應用(9)——使用FastRTC+Gemini創建沉浸式音頻+視頻的藝術評論家

Gradio全解11——Streaming:流式傳輸的視頻應用(9)——使用FastRTCGemini創建沉浸式音頻視頻的藝術評論家11.9 使用FastRTCGemini創建實時沉浸式音頻視頻的藝術評論家11.9.1 準備工作及音頻圖像編碼器1. 項目說明及準備工作2. 音頻和圖像編碼…

Django入門筆記

Python知識點:函數、面向對象。前端開發:HTML、CSS、JavaScript、jQuery、BootStrap。MySQL數據庫。Python的Web框架:Flask,自身短小精悍 第三方組件。Django,內部已集成了很多組件 第三方組件。【主要】1.安裝djang…

當Claude Code失靈,Qwen Code能否成為你的救星?

當Claude Code失靈,Qwen Code能否成為你的救星? 一、開頭:點明困境,引出主角 作為一個大模型博主,日常工作中我經常會使用各種 AI 工具來提高效率,Claude Code 就是我之前非常依賴的一款代碼生成助手 。它…

Go語言快速入門教程(JAVA轉go)——1 概述

優勢 第一個理由:對初學者足夠友善,能夠快速上手。 業界都公認:Go 是一種非常簡單的語言。Go 的設計者們在發布 Go 1.0 版本和兼容性規范后,似乎就把主要精力放在精心打磨 Go 的實現、改進語言周邊工具鏈,還有提升 Go …

【Rust多進程】征服CPU的藝術:Rust多進程實戰指南

?? 歡迎大家來到景天科技苑?? 🎈🎈 養成好習慣,先贊后看哦~🎈🎈 🏆 作者簡介:景天科技苑 🏆《頭銜》:大廠架構師,華為云開發者社區專家博主,…

OpenCV 高階實戰:圖像直方圖與掩碼圖像深度解析

目錄 一、圖像直方圖:讀懂圖像的 “像素分布報告” 1. 什么是圖像直方圖? 2. 圖像直方圖的核心作用 (1)分析亮度分布 (2)判斷對比度高低 (3)輔助圖像增強與閾值分割 &#xf…

基于stm32的家庭安全監測系統設計

若該文為原創文章,轉載請注明原文出處。一、引言(一)研究背景及意義背景:隨著智能家居概念的普及,人們對家庭安全、舒適度和節能提出了更高要求。傳統安防系統功能單一、各系統獨立,缺乏聯動和遠程管理能力…

Oracle體系結構-控制文件(Control Files)

一、 原理 (Principle) 核心定位: 控制文件是一個小型的二進制文件,由 Oracle 實例在啟動和操作過程中持續讀寫。它是數據庫物理結構的權威記錄。數據庫無法啟動或正常操作時,如果無法訪問控制文件,實例將無法識別數據文件和重做日…

路由 下一跳 網關 兩個不同網段的ip如何通過路由器互通

路由 (Routing)核心思想:路徑選擇是什么? 路由是指數據包從源主機傳輸到目標主機的整個過程。這個過程就像寄快遞:你需要決定包裹經過哪些中轉站才能最終到達收件人手里。做什么? 網絡中的設備(主要是路由器&#xff0…

HiDDeN論文解讀與代碼實現

論文:HiDDeN: Hiding Data With Deep Networks 作者:Jiren Zhu, Russell Kaplan, Justin Johnson, Li Fei-Fei一、研究背景 在圖像信息隱藏領域,通常有兩類典型的應用場景:隱寫 (Steganography) 目標:實現秘密通信。要…

實驗室服務器配置|實驗室多人共享GPU|通過Docker實現Linux系統多用戶隔離與安全防控

利用實驗室服務器跑實驗的時候,通常就是兩種方案,一個是向日葵遠程桌面進行操作,一個是通過ssh進行連接,用ssh的話,一般服務器都在內網(例如校園網),是無法在公網(不在校…

2019考研數學(二)真題

一、選擇題 (1) (2) (3) (4) 遺漏點:由通解知特解,特解代入微分方程 (5) ★記住這個題,用的泰勒展開(6) (7) 遺忘點: ★伴隨矩陣的秩與原矩陣秩的關系: (8) 錯誤點:粗心 二、填空題 (9) 易混淆點&#xff…

10 分鐘上手 ECharts:從“能跑”到“生產級”的完整踩坑之旅

10 分鐘上手 ECharts:從“能跑”到“生產級”的完整踩坑筆記 如果你也曾 復制了官方 Demo 卻不知道怎么拆、窗口一拉伸圖表就變形、切換標簽頁后內存暴漲——這篇博客就是為你寫的。 我會用 6 個遞進版本 的源碼,帶你把一張 最簡柱狀圖 逐步進化成 可銷毀…

二級緩存在實際項目中的應用

二級緩存在項目中的應用 目錄 1. 二級緩存簡介2. 應用場景3. 重難點分析4. 結合SpringBoot使用5. 最佳實踐與案例6. 總結 1. 二級緩存簡介 1.1 什么是二級緩存 二級緩存(Second-Level Cache) 是Hibernate框架中的一個重要特性,它提供了應…

深入淺出CRC校驗:從數學原理到單周期硬件實現 (2)CRC數學多項式基礎

數學的優雅:剖開CRC的多項式除法核心看似復雜的CRC校驗,其核心建立在優雅的數學基礎之上。本文將為您揭開CRC算法的數學面紗,讓您真正理解多項式除法的精妙之處。模2運算:CRC世界的特殊算術 CRC計算建立在一種特殊的代數系統上——…

軟考初級有沒有必要考?

對正在學習相關專業的學生或者是行業新人,這篇文章從軟考初級的含義、適合哪些人考、考試難度等方面解答,幫助你判斷要不要報考。一、軟考初級是什么? 軟考初級是軟考體系里面的基礎級別,主要面向在校大學生或是IT行業新人&#x…

11 Prompt 工程進階:Few-shot 與 Chain-of-Thought

11 Prompt 工程進階:Few-shot 與 Chain-of-Thought 前10節總結 & 后10節展望 在前 10 節,我們已經完成了 AI 產品經理的入門階段: 1–3:理解了大模型的基本概念、Token、Prompt 基礎;4–5:體驗了本地部…

ARM1.(ARM體系結構)

1.基本概念嵌入式:以應用為心,以計算機技術為礎,軟便件可被的專用計算機系統。計算機系統的軟件基本組成: 系統軟件、應用軟件。計算機系統的硬件基本組成:運算器、控制器、存諸器、輸入設備、輸出設備日常生活中遇到的專業術語&#xff1a…

Django全棧班v1.01 Python簡介與特點 20250910

從零開始的Python編程之旅 “人生苦短,我用Python。”這不僅僅是Python程序員的口頭禪,更是對Python強大能力的最好詮釋!!! 為什么全世界有超過1500萬開發者選擇Python? 為什么Python連續多年蟬聯最受歡…