当前位置: 首页 > news >正文

手写 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.dtcms.com/a/177478.html

相关文章:

  • 数组和集合
  • 【CSS】Grid 的 auto-fill 和 auto-fit 内容自适应
  • NHANES指标推荐:AISI
  • Qwen2-VL详解
  • cocos中加入protobuf和编译protobuf的方法
  • 软件设计师2025
  • SecureCRT SFTP命令详解与实战
  • Unity3D 游戏内存优化策略
  • 模拟设计中如何减小失配
  • 淘宝按图搜索商品(拍立淘)Java 爬虫实战指南
  • 罗氏线圈抗干扰特性测试方法研究
  • 霍尔传感器与罗氏线圈的对比分析
  • [D1,2] 贪心刷题
  • 3、Kafka 核心架构拆解和总结
  • 私网IP地址范围解析与应用指南
  • 低代码 x AI,解锁数智化应用的创新引擎
  • 自组织映射SOM
  • C++_MD5算法
  • Diamond iO:实用 iO 的第一缕曙光
  • Java从入门到精通 - 程序流程控制
  • 数字化转型是往哪转?怎么转?
  • 单调栈原理
  • 数据库系统概论-基础理论
  • 信息安全 -- 什么是侧信道攻击
  • 《[CISCN 2022 初赛]ez_usb》
  • 六级阅读---2024.12 卷一 仔细阅读1
  • C++类对象的隐式类型转换和编译器返回值优化
  • 智能货架守护者:高精度倾角传感器如何重塑仓储安全管理
  • AI恶魔之眼使用说明书
  • 注意力机制(Attention)