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

手写 vue 源码 === computed 实现

目录

计算属性的基本概念

计算属性的核心实现

ComputedRefImpl 类的实现

ReactiveEffect 与计算属性的关系

计算属性的工作流程

1. 创建计算属性

2. 依赖收集过程

3. 嵌套 effect 的处理

4. 更新过程

嵌套 effect 关系图解 

依赖关系建立过程

代码实现分析

1. 创建计算属性

2. 访问计算属性

3. 响应式数据变化时

具体流程示例

关键点总结

计算属性的缓存机制

总结


计算属性是 Vue 中非常重要的特性,它允许我们声明性地计算衍生值。本文将深入探讨 Vue 的计算属性是如何实现的,特别是它如何依赖 ReactiveEffect  来完成响应式更新。

计算属性的基本概念

计算属性本质上是一个可缓存的值,它只有在依赖的响应式数据发生变化时才会重新计算。这种特性使得计算属性非常适合处理复杂的逻辑计算。

计算属性的核心实现

export function computed(getterOrOptions) {let getter;let setter;let onlyGetter = isFunction(getterOrOptions);if (onlyGetter) {getter = getterOrOptions;setter = () => {};} else {getter = getterOrOptions.get;setter = getterOrOptions.set;}return new ComputedRefImpl(getter, setter);
}

computed 函数接收一个 getter 函数或者一个包含 get 和 set 方法的对象,然后返回一个

ComputedRefImpl 实例。这个实例就是我们使用的计算属性。

ComputedRefImpl 类的实现

class ComputedRefImpl {public _value;public effect;public dep;constructor(public getter, public setter) {this.effect = new ReactiveEffect(() => getter(this._value),() => {triggerRefValue(this);});}get value() {if (this.effect.dirty) {this._value = this.effect.run();trackRefValue(this);}return this._value;}set value(newValue) {this.setter(newValue);}
}

ComputedRefImpl 类是计算属性的核心实现,它包含了三个关键属性:

  •  _value :存储计算结果

  •  effect:一个   ReactiveEffect  实例,用于追踪依赖和触发更新

  •  dep :存储依赖于这个计算属性的其他 effect

ReactiveEffect 与计算属性的关系

计算属性的实现依赖于 ReactiveEffect 类。让我们看看 ReactiveEffect  的关键部分:

export class ReactiveEffect {_trackId = 0;deps = [];_depsLength = 0;_runing = 0;_dirtyLevel = DirtyLevel.Dirty;public active = true;constructor(public fn, public scheduler) {}public get dirty() {return this._dirtyLevel === DirtyLevel.Dirty;}public set dirty(value) {this._dirtyLevel = value ? 
http://www.xdnf.cn/news/412723.html

相关文章:

  • JavaScript高级进阶(七)
  • shell命令大全
  • 基于STM32、HAL库的BMP581气压传感器 驱动程序设计
  • springBoot中的Starter-启动器
  • 重学安卓14/15自由窗口freeform企业实战bug-学员作业
  • 本地文件查重管理工具EasyFileCount v3.0.5.1绿色版,支持查找大重复文件+自动分类
  • 客户端限流主要采用手段:纯前端验证码、禁用按钮、调用限制和假排队
  • jwt学习
  • 如何通过DNS解析实现负载均衡?
  • Android Exoplayer 实现多个音视频文件混合播放以及音轨切换
  • 3d模型的添加与设置
  • VMware虚拟机实例-docker启动失败
  • Linux文件编程——read函数与lseek函数
  • 火狐浏览器安装自定义插件
  • 人工智能的哲学与社会影响
  • 【时时三省】(C语言基础)字符数组的输入输出
  • 做好的QT软件,换一个笔记本打开后发现字体很小,部分字体还被控件遮挡
  • 提示工程实战指南:Google白皮书关键内容一文讲清
  • 第二十二天打卡
  • #将一个 .c 文件转变为可直接运行的文件过程及原理
  • CTF实战秘籍:跨平台文件合并与数据重构技术
  • linux-进程信号的产生
  • OJ判题系统第4期之判题机模块架构——设计思路、实现步骤、代码实现(工厂模式、代理模式的实践)
  • 嵌入式MCU和Linux开发哪个好?
  • FreeRTOS的学习记录(基础知识)
  • FPGA----petalinux开机启动自定义脚本/程序的保姆级教程(二)
  • 【超详细教程】安卓模拟器如何添加本地文件?音乐/照片/视频一键导入!
  • 利用基于LLM的概念提取和FakeCTI数据集提升网络威胁情报对抗虚假信息活动的能力
  • 区块链+农业:从田间到餐桌的信任革命
  • Ref是什么