【学习笔记】Vue3源码解析:第二部分-实现响应式(5)

课程地址:【已完结】全网最详细Vue3源码解析!(一行行带你手写Vue3源码)

第二部分-实现响应式(5):(对应课程的第18-21节)

第18节:《创建ref实例》

vue3中 ref 的作用是将普通类型的数据实现代理,其原理是Object.defineProperty() 。

1、首先,在源码中使用ref并总结其特性;观察打印出来的被ref()加工后的原始字符串值:

在这里插入图片描述

在这里插入图片描述

2、在 reactivity 文件夹下创建ref.ts 文件,在其中定义并暴露 ref 与 shallowRef 方法,这两个方法都接收目标对象target,其内部都返回一个 createRef() 方法;定义 createRef 方法,其返回一个 RefImpl 的实例对象(refImpl是 reference+implement,译为引用实现):

在这里插入图片描述

3、定义 RefImpl 类:

在这里插入图片描述

4、将形参 target 改为 rawValue :

在这里插入图片描述

5、在入口文件中引入并暴露 ref 方法:

在这里插入图片描述

6、examples文件夹中新建3.ref.html 文件,测试刚刚写的ref方法:

在这里插入图片描述
在这里插入图片描述

第19节:《实现ref》

1、引入 Track与trigger方法,引入操作符以及 hasChange 方法::

在这里插入图片描述

2、在类的构造函数中,将用户传入的字符串保存到实例的 _value 属性;定义类的属性访问器:get函数与set函数。在对实例的value的get函数中,Track方法实现收集依赖,并返回用户传入的原始值;set函数中,判断新值与旧值相比是否改变,如果改变则将新值赋值覆盖旧值,并触发trigger方法,用来触发更新:

在这里插入图片描述

3、测试 ref 方法,调试错误,发现判断新值与旧值是否相等的条件中需要取反:

在这里插入图片描述
在这里插入图片描述
修改问题后,页面实现了相应的效果,初始展示出了“张三”,1秒后变成了“555”。说明编写的ref方法奏效了。

疑问:为什么说 ref() 方法的实现原理是 Object.defineProperty() ?

第20节:《实现toRef》

1、在源码中使用 toRef() :

在这里插入图片描述

在这里插入图片描述

2、在 ref.ts 文件中增加实现 toRef 方法的逻辑:

在这里插入图片描述

3、入口文件中引入并导出 toRef 方法:

在这里插入图片描述

4、examples文件夹下新建 4.toRef.html 文件,在其中测试刚刚编写的 toRef 方法。会发现,到现在我们只是实现了通过 toRef 将对象的某个值变成一个实例,并将其值放到实例的 value 属性中,但我们并没有实现这个属性值的响应式,在定时器中改变这个值时,界面并不会改变:

在这里插入图片描述

5、当 state 本身是用reactive 定义的响应式数据时,通过 toRef 将其某个属性值变成一个 ref 实例,此时得到的该值就是响应式的;反之,当 state 本身只是一个普通对象,并不是响应式对象时,通过 toRef 将其某个属性值变成一个 ref 实例,此时得到的该值也不是响应式的。

个人理解:因为当 state 本身是用reactive 定义的响应式数据时,通过 toRef 将其某个属性值变成一个 ref 实例,在以上我们的实现中,定义 ObjectRefImpl 类时,get与set方法中,分别有读取和设置target对象,也就是目标对象state的这个属性值的行为,当目标对象state本身是一个响应式对象时,读取和设置其属性值时,就会触发相应的依赖收集(Track)与触发更新(trigger)的相关逻辑,所以此时就会是响应式的。

在这里插入图片描述

第21节:《实现toRefs》

1、在源码中使用 toRefs:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2、在ref.ts中定义 toRefs 方法:遍历这个target对象,并将其中每一个属性(或元素)用 toRef 方法处理成一个 ref对象:

在这里插入图片描述

3、在入口文件中暴露此方法:

在这里插入图片描述

4、在 examples 下新建 5.toRefs.html 文件,在其中测试刚刚编写的 toRefs 方法,可以打印出与源码相同的结构:

在这里插入图片描述

在这里插入图片描述

5、在工作中经常这样使用:用 toRefs 将一个响应式对象的所有属性都转变成 ref 对象,这样在视图中就可以直接使用这些属性了:在这里插入图片描述

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

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

相关文章

Linux - 基础IO

1、回顾 1.1、来段代码回顾C文件接口 hello.c写文件 #include <stdio.h> #include <string.h> int main() {FILE *fp fopen("myfile", "w");if(!fp){printf("fopen error!\n");}const char *msg "hello world!\n";in…

超好用的一键生成原创文案方法

在现代社会中&#xff0c;原创文案不管是在营销中&#xff0c;还是在品牌推广中都起着至关重要的作用。然而&#xff0c;对于许多人来说&#xff0c;创作出令人印象深刻且引人注目的原创文案并不容易。但随着技术的发展&#xff0c;我们现在可以利用一键生成原创文案的方法来帮…

Googlenet网络架构

原文链接&#xff1a;[1409.4842v1] Going Deeper with Convolutions (arxiv.org) 图源&#xff1a;深入解读GoogLeNet网络结构&#xff08;附代码实现&#xff09;-CSDN博客 表截自原文 以下&#x1f4d2;来自博客深入解读GoogLeNet网络结构&#xff08;附代码实现&#xff0…

PHAMB: 病毒数据分箱

Genome binning of viral entities from bulk metagenomics data | Nature Communications 安装 ### New dependencies *Recommended* conda install -c conda-forge mamba mamba create -n phamb python3.9 conda activate phamb mamba install -c conda-forge -c biocond…

《2024国家自然科学基金青年基金》 相关申请注意事项解读

一 年龄计算 2004 对应 89 2005 对应 90 2006 对应 91 2007 对应 92 2008 对应 93 2009 对应 94 2010 对应 95 .。。 二 资助比例&#xff08;2023&#xff09; 2024年 23.13% 2023年 24% 三 2024年政策变动&#xff0c;只能申请3年的30万&#xff0c;不能像23年一样选择10-20的…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:外描边设置)

设置组件外描边样式。 说明&#xff1a; 从API Version 11开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 outline outline(value: OutlineOptions) 统一外描边样式设置接口。 卡片能力&#xff1a; 从API version 11开始&#xff0c;该…

C++虚继承的一些细节

C虚继承的一些细节 何时使用虚继承普通继承的类对象布局虚继承类对象布局虚函数表指针虚函数表内容 何时使用虚继承 看代码&#xff0c;代码主要是菱形继承&#xff0c;base里面的成员变量会存在二义性 #include<iostream> using namespace std;class base { public:in…

21-Java观察者模式 ( Observer Pattern )

Java备忘录模式 摘要实现范例 观察者模式 ( Observer Pattern ) 常用于对象间存在一对多关系时&#xff0c;比如&#xff0c;当一个对象被修改时&#xff0c;需要自动通知它的依赖对象 观察者模式属于行为型模式 摘要 1. 意图 定义对象间的一种一对多的依赖关系&#xff…

IPsec VPN配置方式

一、手工方式建立 手工方式建立IPsec的场景&#xff0c;全部参数需要手工配置&#xff0c;工作量大&#xff0c;适用于小型静态网络。 当企业总部与分支通过FW1和FW2之间建立的IPsec隧道进行安全通信。 手工配置步骤主要有四个&#xff1a; ①定义需要保护的数据流&#xff1…

蓝桥杯倒计时 36天-DFS练习

文章目录 飞机降落仙境诅咒小怂爱水洼串变换 飞机降落 思路&#xff1a;贪心暴搜。 #include<bits/stdc.h>using namespace std; const int N 10; int t,n; //这题 N 比较小&#xff0c;可以用暴力搜搜复杂度是 TN*N! struct plane{int t,d,l; }p[N]; bool vis[N];//用…

STL空间配置器

参考《STL源码剖析-侯捷》一书 (SGI版本STL) 前置 六大组件 空间配置器实现 SGI版本的空间配置器有两个&#xff0c;一个名为allocator&#xff0c;一个名为alloc。前者符合部分标准&#xff0c;但效率不好&#xff0c;只是对operator new和operator delete进行了封装&#…

电动机工作原理图

电机&#xff08;俗称“马达”&#xff09;是指依据电磁感应定律实现电能转换或传递的一种电磁装置。它的主要作用是产生驱动转矩&#xff0c;作为用电器或各种机械的动力源。 电动机&#xff0c;转子置于旋转磁场中&#xff0c;在旋转磁场的作用下&#xff0c;获得一个转动力…