手寫 Vue 源碼 === 完善依賴追蹤與觸發更新

目錄

依賴收集的完整實現

trackEffects:建立雙向依賴關系

觸發更新的完整實現

完整的響應式流程

為什么使用 Map 而不是 Set?

總結


在上一篇文章中,我們介紹了 Vue3 響應式系統的基本原理和 activeEffect 的作用。現在,我們將深入探討完善后的依賴追蹤和觸發更新機制,特別是 track、 trigger、 trackEffects 和 triggerEffects 函數的實現,以及 ReactiveEffect 類中新增的屬性。

class ReactiveEffect {_trackId = 0; // 當前的 effect 執行了幾次deps = []; // 當前的 effect 依賴了哪些屬性_depsLength = 0; // 當前的 effect 依賴的屬性有多少個public active = true; //默認是響應式的constructor(public fn, public scheduler) {}// ...
}

這些新增的屬性有重要的作用:

  • _trackId:記錄 effect 執行的次數,用于優化依賴收集
  • deps:存儲當前 effect 依賴的所有屬性的依賴集合
  • _depsLength:記錄依賴的屬性數量,避免頻繁計算數組長度

依賴收集的完整實現

// 存儲依賴收集的關系
const targetMap = new WeakMap();export const createDep = (cleanUp, key) => {const dep = new Map() as any; //創建的收集器還是一個mapdep.cleanUp = cleanUp; //清理方法dep.name = key; //收集器名稱return dep;
};export function track(target, key) {if (activeEffect) {let depsMap = targetMap.get(target);if (!depsMap) {targetMap.set(target, (depsMap = new Map()));}let dep = depsMap.get(key);if (!dep) {depsMap.set(key, (dep = createDep(() => depsMap.delete(key), key)));}trackEffects(activeEffect, dep);console.log(targetMap);}
}

與之前相比,有幾個重要的變化:

  • 依賴集合從 Set 變成了 Map,這允許我們存儲更多信息
  • 使用

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

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

相關文章

從代碼學習深度學習 - 區域卷積神經網絡(R-CNN)系列 PyTorch版

文章目錄 前言R-CNNFast R-CNN興趣區域匯聚層 (RoI Pooling)代碼示例:興趣區域匯聚層 (RoI Pooling) 的計算方法Faster R-CNNMask R-CNN雙線性插值 (Bilinear Interpolation) 與興趣區域對齊 (RoI Align)興趣區域對齊層的輸入輸出全卷積網絡 (FCN) 的作用掩碼輸出形狀總結前言…

18個國內wordpress主題推薦

工廠wordpress中文主題 紅藍色搭配的工廠wordpress中文主題,適合從事生產、加工的工廠官方網站使用。 https://www.jianzhanpress.com/?p8533 Pithy設計師wordpress網站模板 精練簡潔的wordpress模板,設計師或設計工作室展示型網站模板。 https://w…

低成本自動化改造技術錨點深度解析

執行摘要 本文旨在深入剖析四項關鍵的低成本自動化技術,這些技術為工業轉型提供了顯著的運營和經濟效益。文章將提供實用且深入的指導,涵蓋老舊設備聯網、AGV車隊優化、空壓機系統智能能耗管控以及此類項目投資回報率(ROI)的嚴謹…

Oracle — 數據管理

介紹 Oracle數據庫作為全球領先的關系型數據庫管理系統,其數據管理能力以高效性、安全性和智能化為核心。系統通過多維度技術實現海量數據的存儲與實時處理,支持高并發事務操作與復雜分析查詢,滿足企業關鍵業務需求。在安全領域,O…

【PhysUnits】3.3 SI 基礎量綱單位(units/base.rs)

一、源碼 這段代碼定義了一系列基礎物理量綱的類型別名,并使用標記 trait Canonical 來表示它們是國際單位制(SI)中的基本單位。 use crate::Dimension; use typenum::{P1, Z0};/// 標記特質,表示基礎量綱單位 pub trait Canoni…

硬件實操技巧記錄

本篇自用,防止自己忘記 焊接技巧 一般都是隨機電烙鐵錫膏組合。 拆電阻時,電烙鐵放在電阻上,加錫膏,這個時候熔點會降低,電阻更容易掉下來,用電烙鐵帶走;焊電阻時,一端點錫膏&…

13.thinkphp的Session和cookie

一.Session 1. 在使用Session之前,需要開啟初始化,在中間件文件middleware.php; // Session 初始化 \think\middleware\SessionInit::class 2. TP6.0不支持原生$_SESSION的獲取方式,也不支持session_開頭的函數&…

TensorFlow中數據集的創建

目錄 前言示例示例1示例2示例3示例4 前言 TensorFlow 的 tf.data.Dataset API 提供了一種靈活且高效的方式來加載和預處理數據。它可以輕松處理大規模數據集,并支持多種數據源格式。 所有數據集相關的內容都在tf.data中,from_tensor_slices:…

第十六章,網絡型攻擊防范技術

網絡攻擊介紹 網絡攻擊 --- 指的是入侵或破壞網絡上的服務器 ( 主機 ) ,盜取服務器的敏感數據或占用網絡帶寬。 網絡攻擊分類: 流量型攻擊 網絡層攻擊 應用層攻擊 單包攻擊 畸形報文攻擊 --- 向目標主機發送有缺陷的IP報文,使得目標在…

服務器不備案有影響嗎

在當今數字化的時代,服務器成為了眾多企業和個人開展業務、展示自我的重要工具。然而,有一個問題常常被忽視,那就是服務器不備案到底有沒有影響? 答案是肯定的!服務器不備案,影響可不小。據相關數據顯示&a…

【LeetCode Solutions】LeetCode 176 ~ 180 題解

CONTENTS LeetCode 176. 第二高的薪水(SQL 中等)LeetCode 177. 第 N 高的薪水(SQL 中等)LeetCode 178. 分數排名(SQL 中等)LeetCode 179. 最大數(中等)LeetCode 180. 連續出現的數字…

D720201 PCIE 轉USB HUB

1. 啟動時出現了下面錯誤 [ 4.682595] pcieport 0004:00:00.0: Signaling PME through PCIe PME interrupt [ 4.684939] pci 0004:01:00.0: Signaling PME through PCIe PME interrupt [ 4.691287] pci 0004:01:00.0: enabling device (0000 -> 0002) [ 5.2962…

【愚公系列】《Manus極簡入門》028-創業規劃顧問:“創業導航儀”

🌟【技術大咖愚公搬代碼:全棧專家的成長之路,你關注的寶藏博主在這里!】🌟 📣開發者圈持續輸出高質量干貨的"愚公精神"踐行者——全網百萬開發者都在追更的頂級技術博主! &#x1f…

IBM BAW(原BPM升級版)使用教程第六講

續前篇! 一、事件:Undercover Agent 在 IBM Business Automation Workflow (BAW) 中,Undercover Agent (UCA) 是一個非常獨特和強大的概念,旨在實現跨流程或系統的事件處理和觸發機制。Undercover Agent 主要用于 事件驅動的流程…

【強化學習】動態規劃(Dynamic Programming, DP)算法

1、動態規劃算法解題 LeetCode 931. 下降路徑最小和 給你一個 n x n 的 方形 整數數組 matrix ,請你找出并返回通過 matrix 的下降路徑 的 最小和 。 下降路徑 可以從第一行中的任何元素開始,并從每一行中選擇一個元素。在下一行選擇的元素和當前行所選…

深入探索DSPy:開啟模塊化AI編程的新篇章

在當今快速發展的AI時代,語言模型(LM)的應用已經滲透到各個領域,從簡單的文本生成到復雜的多模態任務,語言模型展現出了強大的能力。然而,隨著應用場景的日益復雜,開發者們面臨著一個共同的挑戰…

List<T>中每次取固定長度的數據

工具類方法 package org.common.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List;/*** 批處理取值組件* param <T>*/ public class BatchIterator<T> implements Iterator<List<T>> {private final List<T&g…

深入理解 Java 代理模式:從基礎到實戰?

在軟件開發的世界里&#xff0c;設計模式是程序員智慧的結晶&#xff0c;它們為解決常見問題提供了經過驗證的最佳實踐。代理模式作為一種常用的結構型設計模式&#xff0c;在 Java 開發中有著廣泛的應用。本文將深入探討 Java 代理模式&#xff0c;從基本概念、分類、實現原理…

android-ndk開發(11): 安裝 repo 命令

1. 長話短說 mkdir ~/soft/bin curl -L https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo chmod x repo~/.pathrc 添加: export PATH$PATH:~/soft/bin2. 短話長說 repo 的官方介紹頁面&#xff1a; https://gerrit.googlesource.com/git-repo/ repo 的官方下載地…

45.傳導發射整改摸底測試方法

傳導發射整改摸底測試方法 1. 正式摸底預測試2. 簡易方法預測試3. 分析頻譜4. 探查傳播路徑5. 施加措施 1. 正式摸底預測試 去正式實驗室做一次預測試&#xff0c;取得頻譜圖&#xff0c;確定超標頻點和超標量&#xff08;備用&#xff09;。 2. 簡易方法預測試 用小電流探頭…