手写 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.mzph.cn/bicheng/80792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Lattice FPGA 开发】Diamond在线调试Reveal逻辑乱跳的解决

在Vivado中在always块中写逻辑时如果出现always块中的异步复位敏感词在块内部未使用的情况&#xff0c;如下例的rst&#xff1a; always (posedge clk or posedge rst) begin if(~tx_sense_flag)o_rd_adr < d1;else if((o_rd_adr d94) & (bit_cnt d7))o_rd_adr <…

【hadoop】Sqoop数据迁移工具的安装部署

一、Sqoop安装与配置 步骤&#xff1a; 1、使用XFTP将Sqoop安装包sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 3、修改文件夹的名字&#xff0c;将其改为s…

BUUCTF——PYWebsite

BUUCTF——PYWebsite 进入靶场 看看基本信息 没有什么信息 扫个目录看看 http://node5.buuoj.cn:28115/.DS_Store http://node5.buuoj.cn:28115/flag.php http://node5.buuoj.cn:28115/index.html访问flag.php 提示保存购买者的IP 抓包看看 直接XFF伪造一下 X-Forwarded-F…

基于Qt开发的多线程TCP服务端

目录 一、Qt TCP服务端开发环境准备1. 项目配置2. 核心类说明二、服务端搭建步骤详解步骤1:初始化服务端对象步骤2:启动端口监听步骤3:处理客户端连接三、数据通信与状态管理1. 数据收发实现2. 客户端状态监控四、进阶功能扩展1. 多客户端并发处理2. 心跳检测机制五、调试与…

【Tools】VScode使用CMake构建项目

这里写目录标题 vscode 使用 CMake**安装插件**新建CMake项目 vscode 使用 CMake 安装插件 CMake和CMake Tools c等等 CMake插件主要功能是CMake语法高亮、自动补全CMake Tools的功能主要是结合VSCode IDE使用CMake这个工具&#xff0c;比如生成CMake项目、构建CMake项目等…

neo4j图数据库基本概念和向量使用

一.节点 1.新建节点 create (n:GroupProduct {name:都邦高保额团意险,description: "保险产品名称"} ) return n CREATE&#xff1a;Neo4j 的关键字&#xff0c;用于创建新节点或关系。 (n:GroupProduct)&#xff1a; n 是节点的临时别名&#xff08;变量名&#…

2025年渗透测试面试题总结-渗透测试红队面试八(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 渗透测试红队面试八 二百一十一、常见中间件解析漏洞利用方式 二百一十二、MySQL用户密码存储与加密 …

大语言模型主流架构解析:从 Transformer 到 GPT、BERT

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4-turbo模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…

Java设计模式之装饰器模式:从基础到高级的全面解析(万字解析)

装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 一、装饰器模式基础概念 1.1 什么是装饰器模式 装饰…

RN 鸿蒙混合开发实践(踩坑)

#三方框架# #React Native # 1 。环境配置&#xff1b; 安装 DevEco 开发工具&#xff1b; Node 版本16&#xff1b; hdc环境配置 hdc 是 OpenHarmony 为开发人员提供的用于调试的命令行工具&#xff0c;鸿蒙 React Native 工程使用 hdc 进行真机调试。hdc 工具通过 OpenHa…

动态网站 LNMP

一、名词解释&#xff1a; LNMP&#xff1a; L : 代表 Linux 操作系统&#xff0c;为网站提供了可靠的运行环境N : 代表 Nginx&#xff0c;它是一款轻量级的高性能 Web 服务器&#xff0c;能够快速处理大量并 发连接&#xff0c;有效提升网站的访问速度和性能 M : 代表…

DAY04:Vue.js 指令与事件处理深度解析之从基础到实战

1. 指令系统核心概念 1.1 插值表达式与基础指令 Vue.js 的指令系统是其响应式编程模型的核心&#xff0c;我们首先从最基础的插值表达式开始&#xff1a; <div id"app"><!-- 基础文本插值 --><p>{{ message }}</p><!-- JavaScript 表达…

12配置Hadoop集群-集群配置

&#xff08;一&#xff09;Hadoop的组成 对普通用户来说&#xff0c; Hadoop就是一个东西&#xff0c;一个整体&#xff0c;它能给我们提供无限的磁盘用来保存文件&#xff0c;可以使用提供强大的计算能力。 在Hadoop3.X中&#xff0c;hadoop一共有三个组成部…

Kubernetes生产实战(四):kubelet日志快速定位指南

kubelet作为Kubernetes节点的核心管家&#xff0c;其日志是排查节点问题的金钥匙。本文将分享生产环境中查看和分析kubelet日志的完整方案&#xff0c;助你快速定位节点级故障。 一、基础操作&#xff1a;快速查看日志 1. systemd服务日志&#xff08;推荐首选&#xff09; …

麦科信获评CIAS2025金翎奖【半导体制造与封测领域优质供应商】

在苏州举办的2025CIAS动力能源与半导体创新发展大会上&#xff0c;深圳麦科信科技有限公司凭借在测试测量领域的技术积累&#xff0c;入选半导体制造与封测领域优质供应商榜单。本届大会以"新能源芯时代"为主题&#xff0c;汇集了来自功率半导体、第三代材料应用等领…

Python实例题:pygame开发打飞机游戏

目录 Python实例题 题目 pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本 代码解释 初始化部分&#xff1a; 游戏主循环&#xff1a; 退出部分&#xff1a; 运行思路 注意事项 Python实例题 题目 pygame开发打飞机游戏 pygame-aircraft-game使用 Pygame 开发…

Gin 框架入门

Gin 框架入门 一、响应数据 JSON 响应 在 Web 开发中&#xff0c;JSON 是一种常用的数据交换格式。Gin 提供了简便的方法来响应 JSON 数据。 package mainimport ("github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/json", func(c *…

Flink实时数仓数据突变时,如何快速排查原因

在大数据时代,数据的价值已经被无数企业和组织深刻认识到,而实时数仓作为数据处理和分析的重要基础设施,正在逐渐成为推动业务增长和决策优化的核心引擎。想象一下,电商平台在双十一大促期间需要实时监控订单量、用户行为,甚至库存变化,以便及时调整营销策略和物流调度;…

视频人像抠图技术选型--截止2025年4月

前言&#xff1a;我是一名算法工程师&#xff0c;经常需要对某个AI功能做技术调研和输出技术选型报告&#xff0c;在过去多年的工作当中&#xff0c;积累了很多内容&#xff0c;我会陆陆续续将这些内容整理出来分享给大家&#xff0c;希望大家喜欢&#xff0c;感谢您的阅读&…

docker compose ps 命令

docker compose ps 命令用于列出与 Docker Compose 项目相关的容器及其状态。 docker compose ps 能显示当前项目中所有服务容器的运行状态、端口映射等信息。 语法 docker compose ps [OPTIONS] [SERVICE…] SERVICE&#xff08;可选&#xff09;&#xff1a;指定要查看状态…