实现Vue3源码 isReactive 和 isReadonly

本文是 Vue3 源码实战专栏的第 5 篇。

isReactive

isReactive()检查一个对象是否是由 reactive()shallowReactive() 创建的代理。

使用

<script setup>
import { isReactive, reactive } from "vue";
const user1 = reactive({ name: "wendZzoo" });
const user2 = { name: "wendZzoo" };
</script><template>{{ isReactive(user1) }}{{ isReactive(user2) }}
</template>

页面上展示true false

单测

在原本的reactive单元测试上添加isReactive测试断言。

import { isReacive, reactive } from "../reactive";describe("reactive", () => {it("happy path", () => {let original = { foo: 1 };let data = reactive(original);expect(data).not.toBe(original);expect(data.foo).toBe(1);// isReactiveexpect(isReacive(data)).toBe(true);expect(isReacive(original)).toBe(false);});
});

实现

判断一个对象是否是reactive创建的代理,那在访问该对象时会触发其get操作,可以定义当前的对象上是否存在一个key来判断。

reactive.ts文件中导出isReactive方法,

export function isReacive(value) {return !!value['is_reactive'];
}

改造get函数,

function createGetter(isReadonly = false) {return function get(target, key) {let res = Reflect.get(target, key);if (key === "is_reactive") {return !isReadonly;}if (!isReadonly) {track(target, key);}return res;};
}

执行单测yarn test reactive验证isReactive方法是否正确。

优化

定义一个枚举类型来管理is_reactive这样的变量。

export const enum ReactiveFlags {IS_REACTIVE = "__v_isReactive"
}
export function isReacive(value) {return !!value[ReactiveFlags.IS_REACTIVE];
}

get函数中相应的修改,

if (key === ReactiveFlags.IS_REACTIVE) {return !isReadonly;
} 

isReadonly

有了isReactive的实现,isReadonly很类似。

isReadonly()检查传入的值是否为只读对象。只读对象的属性可以更改,但他们不能通过传入的对象直接赋值。

单测

readonly.spec.tshappy path测试用例中添加isReadonly的断言。

import { isReadonly, readonly } from "../reactive";
it("happy path", () => {const original = { foo: 1, bar: { bar: 2 } };const wapper = readonly(original);expect(wapper).not.toBe(original);expect(wapper.foo).toBe(1);// isReadonlyexpect(isReadonly(wapper)).toBe(true);expect(isReadonly(original)).toBe(false);
});

实现

reactive.ts中导出isReadonly方法

export const enum ReactiveFlags {IS_REACTIVE = "__v_isReactive",IS_READONLY = "__v_isReadonly",
}
export function isReadonly(value) {return !!value[ReactiveFlags.IS_READONLY];
}

get函数中新增对readonly的判断

if (key === ReactiveFlags.IS_REACTIVE) {return !isReadonly;
} else if (key === ReactiveFlags.IS_READONLY) {return isReadonly;
}

执行所有单测yarn test验证。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142735.shtml

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

相关文章

vscode使用flake8设置单行最长字符限制设置失败的问题

vscode使用flake8设置单行最长字符限制设置失败的问题 问题描述解决方案 问题描述 如图所示&#xff0c;使用flake8单行字数过长&#xff0c;就会有有红色底的波浪线 一般情况下很多教程都会让你在setting.json里面设置 但是我打开我的setting.json&#xff0c;发现我已经进…

【Python】上市公司数据进行经典OLS回归实操

一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化&#xff0c;所有解释变量5、绘制热…

【CASS精品教程】打开cass提示base.dcl未找到文件的解决办法

打开cass 7.1时提示base.dcl未找到文件的解决办法。 文章目录 一、问题描述二、解决办法 一、问题描述 系统上安装了cad2006cass7.1&#xff0c;cass软件可以正常打开&#xff0c;但是在使用屏幕菜单绘制地图时&#xff0c;选择一个工具&#xff0c;提示base.dcl未找到文件&am…

Databend 与海外某电信签约:共创海外电信数据仓库新纪元

为什么选择 Databend 海外某电信面临的主要挑战是随着业务量的增加&#xff0c;传统的 Clickhouse Hive 方案在数据存储和处理上开始显露不足。 原来的大数据分析采用的 Clickhouse Hive 方案进行离线的实时报表。但随着业务量的上升后&#xff0c;Hive的数据存储压力变大&…

正点原子嵌入式linux驱动开发——Linux IIO驱动

工业场合里面也有大量的模拟量和数字量之间的转换&#xff0c;也就是常说的ADC和DAC。而且随着手机、物联网、工业物联网和可穿戴设备的爆发&#xff0c;传感器的需求只持续增强。比如手机或者手环里面的加速度计、光传感器、陀螺仪、气压计、磁力计等&#xff0c;这些传感器本…

Hadoop3.3.4分布式安装

安装前提&#xff1a;已经配置好java环境&#xff0c;所有机器之间ssh的免密登录。 注意&#xff1a;下文中的flinkv1、flinkv2、flinkv3是三台服务器的别名 1.集群部署规划 注意&#xff1a;NameNode和SecondaryNameNode不要安装在同一台服务器 注意&#xff1a;ResourceMan…

openssl+AES开发实例(linux)

文章目录 一、AES介绍二、AES原理三、AES开发实例 一、AES介绍 AES&#xff08;Advanced Encryption Standard&#xff09;是一种对称密钥加密标准&#xff0c;它是一种对称加密算法&#xff0c;意味着相同的密钥用于加密和解密数据。AES 是 NIST&#xff08;美国国家标准与技…

pg运维之REDUCE WAL BY INCREASING CHECKPOINT DISTANCE

如果你在生产中运行PostgreSQL&#xff0c;你可能已经注意到&#xff0c;调整检查点对调整服务器和提高数据库整体性能是一件非常有益的事情。然而&#xff0c;这里面还有更多的内容。增加检查点的距离也可以帮助实际减少首先创建的WAL的数量。这是对的。这不仅仅是一个性能问题…

nginx四层tcp负载均衡及主备、四层udp负载均衡及主备、7层http负载均衡及主备配置(wndows系统主备、负载均衡)

准备工作 服务器上安装、配置网络负载平衡管理器 windows服务器热备、负载均衡配置-CSDN博客 在windows服务器上安装vmware17 win10 上安装vmware17-CSDN博客 在windows上利用vmware17 搭建centos7 mini版 在windows上利用vmware17 搭建centos7 mini版本服务器-CSDN博客 …

机器学习和深度学习领域的算法和模型

机器学习和深度学习领域有许多算法和模型&#xff0c;以下是一些常见的算法和模型&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;逻辑回归&#xff08;Logistic Regression&#xff09;决策树&#xff08;Decision Tree&#xff09;随机森林&#xff08;Ran…

设计模式-策略模式(Strategy)

设计模式-策略模式&#xff08;Strategy&#xff09; 一、策略模式概述1.1 什么是策略模式1.2 简单实现策略模式1.3 使用策略模式的注意事项 二、策略模式的用途三、策略模式实现方式3.1 简单策略模式3.2 组合策略模式3.3 动态策略模式 一、策略模式概述 1.1 什么是策略模式 …

225.用队列实现栈(LeetCode)

思路 思路&#xff1a;用两个队列实现栈后进先出的特性 &#xff0c;两个队列为空时&#xff0c;先将数据都导向其中一个队列。 当要模拟出栈时&#xff0c;将前面的元素都导入另一个空队列&#xff0c;再将最后一个元素移出队列 实现 实现&#xff1a; 因为C语言没有库可以…

std::map使用自定义的数据结构当做key

一、std::map是按照键的顺序进行排序的&#xff0c;因此需要定义结构类型的比较运算符。通常情况下&#xff0c;你可以通过重载结构类型的小于运算符<来定义比较逻辑。 #include <map>class CKey { public:CKey(int a) { m_a a; }~CKey() default;//也可以在外部(二…

【Linux篇】冯 诺依曼计算机结构体系

详解冯 诺伊曼体系 CPU : 运算器 && 控制器输入设备 : 话筒&#xff0c;摄像头&#xff0c;键盘&#xff0c;鼠标&#xff0c;磁盘&#xff0c;网卡等输出设备 : 显卡&#xff0c;声卡&#xff0c;网卡&#xff0c;磁盘&#xff0c;显示器&#xff0c;打印机等存储器 :…

中睿天下Coremail | 2023年Q3企业邮箱安全态势观察报告

10月25日&#xff0c;北京中睿天下信息技术有限公司联合Coremail邮件安全发布《2023年第三季度企业邮箱安全性研究报告》。2023年第三季度企业邮箱安全呈现出何种态势&#xff1f;作为邮箱管理员&#xff0c;我们又该如何做好防护&#xff1f; 以下为精华版阅读&#xff0c;如需…

景联文科技:驾驭数据浪潮,赋能AI产业——全球领先的数据标注解决方案供应商

根据IDC相关数据统计&#xff0c;全球数据量正在经历爆炸式增长&#xff0c;预计将从2016年的16.1ZB猛增至2025年的163ZB&#xff0c;其中大部分是非结构化数据&#xff0c;被直接利用&#xff0c;必须通过数据标注转化为AI可识别的格式&#xff0c;才能最大限度地发挥其应用价…

arcgis--浮点型栅格数据转整型

利用【Spatial Analyst工具】-【数学】-【转为整型】工具&#xff0c;将浮点型数据转为整型。如下&#xff1a; 【转为整型】对话框参数设计如下&#xff1a; 转换结果如下&#xff1a;

C_8练习题

一、单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 编写C语言程序一般需经过的几个步骤依次是()。 A.编辑、调试、编译、连接 B.编辑、编译、连接、运行 C.编译、调试、编辑、连…

阿里云全球故障凸显“云集中”风险

阿里云12日发生的全球性故障再次将“云集中风险”推上风口浪尖。这一公有云史上罕见的事件不仅影响了数以万计的企业和服务&#xff0c;也引发了对云服务集中化趋势的深刻反思。 2023年11月12日17:44(GMT8)开始&#xff0c;阿里云基础设施发生严重故障&#xff0c;导致阿里巴巴…

【多线程 - 07、中断线程 interrupt】

中断线程 Thread类中interrupt()、interrupted()和isInterrupted()方法 interrupt()方法 其作用是中断此线程&#xff08;此线程不一定是当前线程&#xff0c;而是指调用该方法的Thread实例所代表的线程&#xff09;&#xff0c;但实际上只是给线程设置一个中断标志&#xff0c…