当前位置: 首页 > 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,这允许我们存储更多信息
  • 使用

相关文章:

  • 数组和集合
  • 【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从入门到精通 - 程序流程控制
  • 乌克兰议会批准美乌矿产协议
  • 谢晖不再担任中超长春亚泰队主教练:战绩不佳主动请辞
  • 体坛联播|国米淘汰巴萨晋级欧冠决赛,申花击败梅州避免连败
  • “子宫内膜异位症”相关论文男性患者样本超六成?福建省人民医院展开调查
  • 五一假期,长三角铁路张家港、台州等多个车站客发量创新高
  • 上海畅通“外转内”,外贸优品成“香饽饽”