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

手写 Vue 源码 === 依赖清理机制详解

目录

引言

响应式系统基础回顾

依赖清理的必要性

ReactiveEffect 类的设计

依赖清理的三个关键函数

1. preCleanEffect:执行前的准备

2. trackEffects:依赖收集与 diff 算法

3. postCleanEffect:执行后的清理

4. cleanDepEffect:清理依赖

实际案例分析

依赖清理算法的优化

总结


引言

Vue 的响应式系统是其核心特性之一,而依赖清理机制则是确保响应式系统高效运行的关键部分。本文将深入探讨 Vue 响应式系统中的依赖清理机制,特别是 preCleanEffect、 postCleanEffect 以及 trackEffects 中的 diff 算法,并通过实际案例分析其工作原理。

响应式系统基础回顾

在深入依赖清理之前,让我们先简单回顾一下 Vue 响应式系统的基本工作原理:

  1. 当我们使用  effect  函数包裹一个回调函数时,这个回调函数会立即执行
  2. 执行过程中,会访问响应式对象的属性,触发 getter
  3. 在 getter 中,会通过 track 函数收集当前正在执行的 effect 作为依赖
  4. 当响应式对象的属性发生变化时,会通过 trigger 函数触发收集的依赖,重新执行 effect
export function effect(fn, options: any = {}) {// 创建一个 effect 只要依赖的属性变化,就会重新执行const _effect = new ReactiveEffect(fn, () => {_effect.run();});// 执行_effect.run();
}

依赖清理的必要性

为什么需要依赖清理?考虑以下场景:

effect(() => {if (condition) {console.log(obj.a)} else {console.log(obj.b)}
})

conditiontrue 时,effect 依赖 obj.a;当 conditionfalse 时,effect 依赖 obj.b

如果没有依赖清理机制,当 conditiontrue 变为 false 后,effect 仍然会保持对 obj.a 的依赖。这意味着当 obj.a 变化时,effect 会重新执行,但实际上 obj.a 已经不再被使用了。

ReactiveEffect 类的设计

首先,让我们看一下 ReactiveEffect 类的设计,它是依赖清理机制的核心:

class ReactiveEffect {_trackId = 0; // 当前的 effect 执行了几次deps = []; // 当前的 effect 依赖了哪些属性_depsLength = 0; // 当前的 effect 依赖的属性有多少个public active = true; //默认是响应式的constructor(public fn, public scheduler) {}run() {// 如果当前状态是停止的,执行后,啥都不做if (!this.active) {return this.fn();}let lastEffect = activeEffect;try {activeEffect = this; // 当前的 effect 「依赖收集」// 每次执行前需要将上一次的依赖清空 effect.depspreCleanEffect(this);
http://www.dtcms.com/a/179426.html

相关文章:

  • Arm核的Ubuntu系统上安装Qt
  • 系统网络运维基础:Linux与Windows实践指南(带电子书资料)
  • Qt 通过控件按钮实现hello world + 命名规范(7)
  • 课外活动:简单了解原生测试框架Unittest前置后置的逻辑
  • Vue.js Watch 侦听器:深入理解与应用
  • 低代码云MES、轻量级部署、让智造更简单
  • 【AI入门】CherryStudio入门5:创建知识库,对接Obsidian 笔记
  • 特殊版本,官宣永久免费
  • 摄像头模组AF、OIS模组
  • 308.旅行终点站
  • 援外培训项目冈比亚数字政府能力建设研修班莅临麒麟信安参观考察
  • Linux基础(最常用基本命令)
  • 移动端返回指定页面
  • Linux命令行参数注入详解
  • MacBook M2芯片 Sequoia15.4.1 安装免费版VMware Fusion 13.6.3版本
  • 【详细图文】使用MobaXterm的SSH功能远程连接服务器,并创建pytorch环境,使用yolov8训练数据集
  • 大数据TopK问题
  • sql server限制用户只能访问特定表
  • windows10 系统显示mov文件格式缩略图
  • 如何从播放器构造角度研究 Media3 源码
  • 最新阿里九宫格识别模型,连线,231 协议算法
  • 〖 Linux 〗操作系统进程管理精讲(2)
  • 148.WEB渗透测试-MySQL基础(三)
  • java每日精进 5.08【框架之数据权限补充】
  • Linux系统(OpenEuler22.03-LTS)部署FastGPT
  • MySql集群架构
  • [逆向工程]什么是DLL注入(二十二)
  • 1.3.1 Linux音频框架alsa详细介绍
  • Inno Setup专业打包指南:从基础到高级应用
  • 前端面经 作用域和作用域链