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

vue/core源码中ref源码的js化

起源:

当看见reactivity文件中的ref.ts文件长达五百多的ts代码后,突发奇想想看下转化成js有多少行。

进行转化:

let shouldTrack = true; // Define shouldTrack variable
let activeEffect = null; // Define activeEffect variable// 定义 ref 函数
function ref(value) {return createRef(value, false);
}// 浅的引用 ref
function shallowRef(value) {return createRef(value, true);
}// 创造 ref 函数
function createRef(rawValue, shallow) {// 判断 rawValue 是不是 ref 类型的if (isRef(rawValue)) {// 是的话直接 returreturn rawValue;}// 不是的话 使用:RefImpl 将其变成ref对象后return出去return new RefImpl(rawValue, shallow);
}
// 定义 ref的 对象 RefImpl 类
class RefImpl {constructor(value, isShallow) {this._rawValue = isShallow ? value : toRaw(value);this._value = isShallow ? value : toReactive(value);}get value() {trackRefValue(this);return this._value;}set value(newVal) {const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);newVal = useDirectValue ? newVal : toRaw(newVal);if (hasChanged(newVal, this._rawValue)) {this._rawValue = newVal;this._value = useDirectValue ? newVal : toReactive(newVal);triggerRefValue(this, DirtyLevels.Dirty, newVal);}}
}function trackRefValue(ref) {if (shouldTrack && activeEffect) {ref = toRaw(ref);trackEffect(activeEffect,(ref.dep ??= createDep(() => (ref.dep = undefined),ref instanceof ComputedRefImpl ? ref : undefined,)),__DEV__? {target: ref,type: TrackOpTypes.GET,key: 'value',}: void 0);}
}function triggerRefValue(ref, dirtyLevel = DirtyLevels.Dirty, newVal) {ref = toRaw(ref);const dep = ref.dep;if (dep) {triggerEffects(dep,dirtyLevel,__DEV__? {target: ref,type: TriggerOpTypes.SET,key: 'value',newValue: newVal,}: void 0);}
}
// 判断是不是ref
function isRef(r) {return !!(r && r.__v_isRef === true);
}function toRaw(observed) {return observed;
}function toReactive(value) {return value;
}let result = ref(0);
console.log(result);

转化完毕,相信看过源码的小伙伴一经发现,转化前的代码非常臃肿且难以阅读,转化后的代码轻便易于阅读,且能快速在浏览器的控制台调试和实现ref的功能。

最后我们通过打印result可以看到输出了一个RefImpl对象,之后我们通过打印result.value即可获得我们当初传给ref的0

经过测试,发现输出的颜色很淡的values是class类中的get values方法

当传进_value的值的时候,因为构造函数中的get values方法是return的,所以在最后的console中点开values是可以看见: "这里是_values"输出的

将get values函数中return改为console后,打印出来的values就是undefined了,因为没有向外return了

同理,这时候想要学习vue3,通过john.values就可以打印出: "这里是_value"了.

但是感觉下面的_value和value是一个东西,可以用_value统一起来方便看:

class RefImpl {
  constructor(value, isShallow) {
    this._rawValue = isShallow ? value : toRaw(value);
    this._value = isShallow ? value : toReactive(value);
  }

  get value() {
    trackRefValue(this);
    return this._value;
  }

  set value(newVal) {
    const useDirectValue = this.__v_isShallow || isShallow(newVal) || isReadonly(newVal);
    newVal = useDirectValue ? newVal : toRaw(newVal);
    if (hasChanged(newVal, this._rawValue)) {
      this._rawValue = newVal;
      this._value = useDirectValue ? newVal : toReactive(newVal);
      triggerRefValue(this, DirtyLevels.Dirty, newVal);
    }
  }
}

上述: get value方法中return的this._value就是constructor中穿进去的value,统一更方便看.

相关文章:

vue/core源码中ref源码的js化

起源: 当看见reactivity文件中的ref.ts文件长达五百多的ts代码后,突发奇想想看下转化成js有多少行。 进行转化: let shouldTrack true; // Define shouldTrack variable let activeEffect null; // Define activeEffect variable// 定义…...

准备打ccf

准备打ccf...

k8s遇到的错误记录

时隔四年有开始重新鼓捣k8s了,重新安装后遇到的错误记录如下: Error: Package: kubelet-1.14.0-0.x86_64 (kubernetes) Requires: kubernetes-cni 0.7.5 Available: kubernetes-cni-0.3.0.1-0.07a8a2.x86_64 (kubernetes) …...

全局平均池化笔记

全局平均池化(Global Average Pooling, GAP)是一种用于卷积神经网络(CNN)中的池化操作,其主要作用和优点包括: 减少参数数量:全局平均池化层将每个特征图通过取其所有元素的平均值,压…...

【数仓系列】maxcompute、postgresql、sparksql等行转列数据处理实战总结(其他类型持续总结更新)

1.熟悉、梳理、总结项目研发实战中的SQL开发日常使用中的问题、经验总结,都是常用的开发技能,可以省去很多时间,时间长就忘记了 2.欢迎点赞、关注、批评、指正,互三走起来,小手动起来! 文章目录 1.maxcompu…...

用数据,简单点!奇点云2024 StartDT Day数智科技大会,直播见

在充满挑战的2024,企业如何以最小化的资源投入和试错成本,挖掘新的增长机会,实现确定性发展? “简单点”是当前商业环境的应对策略,也是奇点云2024 StartDT Day的核心理念。 5月28日,由奇点云主办的2024 S…...

Cloneable接口和深拷贝

在java中如何对对象进行拷贝呢?我们可以使用Object类中的clone方法。 一、浅拷贝 在使用clone方法对对象进行拷贝的时候,需要注意: 1.需要重写clone方法; 2.clone方法的返回值是Object类,需要强制类型转化&#xf…...

C++:vector的介绍及使用

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 文章目录 前言 一、vector的介绍 二、vector的使用 2.1.构造和赋值重载(Member functions) 2.2 vector iterator 的使用 2.3 vector 空间增长问题 2.4 vector 增删查改 三 sort 四 v…...

【机器学习】大模型在机器学习中的应用:从深度学习到生成式人工智能的演进

🔒文章目录: 💥1.引言 ☔2.大模型概述 🚲3.大模型在深度学习中的应用 🛴4.大模型在生成式人工智能中的应用 👊5.大模型的挑战与未来展望 💥1.引言 随着数据量的爆炸性增长和计算能力的提…...

营销短信XML接口对接发送示例

在现代社会中,通信技术日新月异,其中,短信作为一种快速、简便的通信方式,仍然在日常生活中占据着重要的地位。为了满足各种应用场景的需求,短信接口应运而生,成为了实现高能有效通信的关键。 短信接口是一种…...

【C语言刷题系列】求一个数组中两个元素a和b的和最接近整数m

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:C语言刷题系列 目录 一、问题描述 二、解题思路 解题思路: 解题步骤: 三、C语言代码实现及测试 一、问题描述 给定一…...

Python pdf2imges -- pdf文件转图片

pdf文件转图片,需要安装PyMuPDF包,具体PyMuPDF包介绍可以参考:Python 处理 PDF 的神器 -- PyMuPDF import fitz # pip install PyMuPDF# PDF转换为IMG统一管理 def pdf_to_images(pdf_path, img_path, filename):"""pdf_p…...

分布式版本控制工具 git

git 是什么 分布式版本控制工具。github 是代码托管平台。 git 有什么用 保存文件的所有修改记录。使用版本号(sha1 哈希值) 进行区分。随时可浏览历史版本记录。可还原到历史指定版本。对比不同版本的文件差异。 为什么要使用 git 多人协作开发一个大…...

Flutter 中的 ExpansionTile 小部件:全面指南

Flutter 中的 ExpansionTile 小部件:全面指南 在 Flutter 应用中,ExpansionTile 是一个常用的折叠列表项,它允许用户点击标题来展开或折叠更多的内容。这个组件在实现可折叠列表、FAQ 部分或显示详情信息时非常有用。本文将详细介绍 Expansi…...

二进制的协议的测试程序

一、引子 由于要调试二进制私有协议,不想用C重头到尾写,用C写工程量有点大,因此想找一个比较简单的工具,postman无法实现,外界的几乎找不到合适的工具,只能考虑手写一个。 前面写了一个python通过tcp协议发…...

多线程事务

一、业务场景 我们在工作中经常会到往数据库里插入大量数据的工作,但是既需要保证数据的一致性,又要保证程序执行的效率。因此需要在多线程中使用事务,这样既可以保证数据的一致性,又能保证程序的执行效率。但是spring自带的Trans…...

春秋云境CVE-2020-26048

简介 CuppaCMS是一套内容管理系统(CMS)。 CuppaCMS 2019-11-12之前版本存在安全漏洞,攻击者可利用该漏洞在图像扩展内上传恶意文件,通过使用文件管理器提供的重命名函数的自定义请求,可以将图像扩展修改为PHP&#xf…...

MySQL 带游标的存储过程(实验报告)

一、实验名称: 带游标的存储过程 二、实验日期: 2024 年 5月 25 日 三、实验目的: 掌握MySQL带游标的存储过程的创建及调用; 四、实验用的仪器和材料: 硬件:PC电脑一台; 配置&#xff1…...

结构体(位段)内存分配

结构体由多个数据类型的成员组成。那编译器分配的内存是不是所有成员的字节数总和呢? 首先,stu的内存大小并不为29个字节,即证明结构体内存不是所有成员的字节数和。   其次,stu成员中sex的内存位置不在21,即可推测…...

基于SSH的母婴用品销售管理系统带万字文档

文章目录 母婴商城系统一、项目演示二、项目介绍三、系统部分功能截图四、万字论文参考五、部分代码展示六、底部获取项目源码和万字论文参考(9.9¥带走) 母婴商城系统 一、项目演示 母婴商城系统 二、项目介绍 基于SSH的母婴商城系统 系统…...

Springboot 实现多数据源(PostgreSQL 和 SQL Server)连接父

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

iOS 15-16设备iCloud锁绕过技术全解析:从原理到实战应用

iOS 15-16设备iCloud锁绕过技术全解析:从原理到实战应用 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n iCloud激活锁作为苹果生态的重要安全机制,在保护用户数据安全的同时&am…...

移动端兼容性测试的“苦”与“解”

一场与碎片化的持久战凌晨两点的办公室,测试工程师李明面对第37台报错设备苦笑——同一功能在A品牌流畅运行,却在B品牌低端机型反复闪退。屏幕上的崩溃日志如天书般蔓延,身后堆积如山的测试设备沉默宣告着移动端兼容性测试的残酷现实。在设备…...

3天打造个性化音乐服务:KuGouMusicApi全场景开发指南

3天打造个性化音乐服务:KuGouMusicApi全场景开发指南 【免费下载链接】KuGouMusicApi 酷狗音乐 Node.js API service 项目地址: https://gitcode.com/gh_mirrors/ku/KuGouMusicApi KuGouMusicApi是一套基于Node.js构建的酷狗音乐API服务(应用程序…...

2025届毕业生推荐的十大AI写作平台实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 被称作DeepSeek的论文,系统地阐述了大规模语言模型的技术架构,以及训…...

最新付费进群系统源码 V4.1全开源版本源码 附教程

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示一、详细介绍 最新付费进群系统源码 V4.1全开源版本源码 附教程 亲测可用 付费进群系统是一种基于互联网的社群管理工具,用户通过支付一定费用后获得加入特定群组的权限。这种系统通常用于知识分享、资源下…...

PPTist:基于Vue3与TypeScript的在线演示文稿技术架构解析

PPTist:基于Vue3与TypeScript的在线演示文稿技术架构解析 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing…...

深入解析zlog:从编译安装到高级配置实战(含交叉编译指南)

1. zlog简介与核心优势 在嵌入式开发和服务器应用中,日志管理一直是系统稳定性的关键环节。zlog作为一款轻量级、高性能的C语言日志库,相比传统的syslog或log4c有着显著优势。我第一次接触zlog是在一个物联网网关项目中,当时系统频繁出现日志…...

VSCode Remote SSH 一直转圈连不上服务器?踩坑全记录

VSCode Remote SSH 一直转圈连不上服务器?踩坑全记录环境:Ubuntu 服务器 / VSCode Remote SSH / Miniconda问题描述 VSCode 通过 Remote SSH 连接服务器时,一直显示"正在连接",转圈转个没完,既不报错也不成功…...

Multisim 14.0实战:用74LS160和74LS161搭建61进制计数器(附完整电路图)

Multisim 14.0实战:用74LS160和74LS161搭建61进制计数器 在电子工程领域,计数器电路设计是数字逻辑课程的核心实践内容之一。对于初学者而言,理解计数器的工作原理并通过仿真软件实现特定进制计数功能,不仅能巩固理论知识&#x…...