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

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

第二部分-实现响应式(3):(对应课程的第10-14节)

第10节:《定义收集依赖的effect方法》

vue3中的effect相当于vue2中的watcher。

一、在源码中使用effect方法

1、首先,在源码的vue/examples下,新建2.effect.html文件,在其中使用effect方法:
在这里插入图片描述
在这里插入图片描述

总结:effect函数的作用:它是一个会默认自动执行的方法,当在视图中获取数据时,会触发代理对象的get,此时会进行收集effect;当修改数据时,会触发响应式对象的set,此时执行对应的effect。

在这里插入图片描述

effect方法的第二个参数可以传递一个配置对象,当配置lazy:true时,effect不会默认执行:

在这里插入图片描述

二、实现effect方法

2、在reactivity下新建effect.ts文件,在其中暴露effect方法:
在这里插入图片描述

3、在入口文件中引入并暴露effect方法:

在这里插入图片描述

4、编写effect方法:它接收一个函数fn,以及一个配置对象options。其函数体内定义一个函数并返回,且判断options的lazy属性不为真时,该函数会被执行。该函数是由一个createReactiveEffect函数生成的,这个函数接收了外层函数的入参fn和options作为自己的入参:

createReactiveEffect函数内部逻辑为:返回一个方法,并将其保存在effect变量中;这个方法会执行用户传递给effect的方法,即fn入参:
在这里插入图片描述

5、测试刚刚编写的effect方法:examples下新建文件2.effect.html

在这里插入图片描述

浏览器打开2.effect.html,可以看到控制台打印了500

第11节:《定义栈结构》

1、为effect添加属性:
为什么要为effect添加属性?因为收集effect的目的是为了更新视图,当读取响应式对象的属性A和属性B时,这两个属性分别对应各自的一个effect,它们对应的各自的effect是不一样的,所以需要区别。
在这里插入图片描述

2、在createGetter中,获取数据时,添加收集effect逻辑:

在这里插入图片描述

3、新建operations操作符文件,在其中定义操作符:

在这里插入图片描述

4、引入操作符文件,并在get中读取数据时进行收集effect时,调用Track方法,入参分别为:target(目标对象)、操作符类型,此处为get,key(读取的对象的属性)

在这里插入图片描述

5、在effect.ts中定义Track方法。在全局定义activeEffect,保存effect,并传递到Track方法里:

在这里插入图片描述

6、打印结果如下:

在这里插入图片描述

7、解决一个嵌套的问题,如下代码,effect方法里,又嵌套了一个effect方法,用一个栈形结构来处理这个问题:

在这里插入图片描述

在这里插入图片描述

第12节:《收集effect依赖》

1、当某个属性被重复读取时,如state.a,此时收集的仍然是其对应的那一个effect,不需要重复收集:

在这里插入图片描述

增加 if 判断:

在这里插入图片描述

2、在Track方法中收集effect:定义一个WeakMap结构,保存到 targetMap 变量中,首先判断 targetMap 中之中是否已经保存过了 target 这个值,如果没有则将其保存进去,将target(即用户传给响应式API的目标对象)设置为键,new 一个Map结构设置为其对应的值。

在这里插入图片描述

在这里插入图片描述

在 effect 中读取响应式对象的属性name时:

在这里插入图片描述

查看控制台打印出来的 targetMap :

在这里插入图片描述
可以看到其结构为:首先它是一个 weakMap 结构,其键为target对象,值为一个Map结构,这个Map结构中,键是被访问的target的属性name,值是一个Set结构,这个Set结构中,存放着effect方法

在这里插入图片描述

当在 effect 中使用 name 和 age 时:

在这里插入图片描述

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

分别在两个effect中使用name时:

在这里插入图片描述

在这里插入图片描述

第13节:《判断数组是否新增还是修改》

vue3与vue2实现响应式还有一个不同的点是:vue3用proxy实现响应式可以直接实现对数组的代理,不需要像vue2一样劫持数组的方法去进行改写

1、在shared中增加几个公共方法:

在这里插入图片描述

2、baseHandlers中引入这些公共方法,并在 createSetter 方法中添加如下逻辑:首先存储旧值;然后判断目标对象是数组还是对象,如果是数组且其访问的key值小于数组长度,即读取的数组已有项;如是对象则判断对象是否有被访问的这个属性key,如有则是访问对象的一个已有值。这样就可以区分是为目标对象新增一个key值还是访问目标对象的已有值。

在这里插入图片描述

第14节:《总结知识点及面试题》

本节课基本没啥知识点

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

探索AI视频模型的无限可能:OpenAI的Sora引领创新浪潮

文章目录 📑前言一、技术解析二、应用场景三、未来展望四、伦理与创意五、用户体验与互动🌤️总结 📑前言 随着人工智能技术的蓬勃发展,AI视频模型正逐渐成为科技领域的新宠。在这个变革的浪潮中,OpenAI推出的首个AI视…

Web前端---图层嵌套与层叠三行三列效果

1.图层的嵌套设计 <!doctype html> <html> <head> <meta charset"utf-8"> <title>图层嵌套</title><style type"text/css">.inline_div{display:inline-block;}#wrap{width400px;height250px;border:2px solid…

Soul App发布春节特产社交报告,全面解析当代年轻人的社交新趋势

近日,社交平台Soul App发布了《2024年春节“特产社交”趋势洞察报告》,深入剖析了年轻用户在春节期间的特产消费新习惯和社交新方式。这份报告基于平台内容和2395份调研样本,重点关注18-34岁用户群体,特别是00后用户,为我们呈现了一系列有趣的趋势。 年轻人的过年选择:看世界,却…

数据卷dockerfile

目录 一、数据卷 1. 简介 2. 数据卷和数据卷容器 1. 数据卷&#xff1a; 2. 数据卷容器&#xff1a; 二、自定义镜像 1. 作用 2. 自定义centos 3. 自定义tomcat8 一、数据卷 1. 简介 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;它将主机操作系统目录直…

【C++】拿下! C++中的内存管理

内存管理 1 C 的内存分布2 C语言的内存管理3 C的内存管理3.1 内置类型操作3.2 自定义类型操作 4 operator new与operator delete函数&#xff08;重点&#xff09;5 new和delete的实现原理5.1 内置类型5.2 自定义类型new的原理delete的原理new T[ N ] 的原理lete[]的原理 6 总结…

使用RestTemplate发送HTTP请求

文章目录 1.1 RestTemplate环境准备1&#xff09;背景说明2&#xff09;工程配置RestTemplate 1.2 RestTemplate API入门-11&#xff09;get请求携带参数访问外部url2&#xff09;get请求响应数据自动封装vo实体对象3&#xff09;请求头携带参数访问外部接口 1.3 RestTemplate …

【Linux】云服务器的Redis被黑

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Linux ⛺️稳中求进&#xff0c;晒太阳 攻击发现&#xff1a; 这个异常情况是在腾讯云被入侵后&#xff0c;短信提醒发现的。并没有系统的学习过关于服务器安防相关的知识&#xff0c;遇到…

某查查首页瀑布流headers加密

目标网站&#xff1a; 某查查 对目标网站分析发现 红框内的参数和值都是加密的&#xff0c;是根据算法算出来的&#xff0c;故进行逆向分析。 由于没有固定参数名&#xff0c;只能通过搜索headers&#xff0c;在搜索的位置上打上断点&#xff0c;重新请求。 断点在此处断住&a…

基于springboot实现鞋类商品购物商城系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现鞋类商品购物商城系统演示 摘要 时代的变化速度实在超出人类的所料&#xff0c;21世纪&#xff0c;计算机已经发展到各行各业&#xff0c;各个地区&#xff0c;它的载体媒介-计算机&#xff0c;大众称之为的电脑&#xff0c;是一种特高速的科学仪器&#xf…

trie树(前缀树)

前缀树 1. 前缀树的的介绍2.前缀树的实现2.1插入功能2.2删除功能2.3查找前缀和查找单词功能2.4 哈希表版本 1. 前缀树的的介绍 在计算机科学中&#xff0c;trie&#xff0c;又称前缀树或字典树&#xff0c;是一种有序树&#xff0c;用于保存关联数组&#xff0c;其中的键通常是…

177基于matlab的基于S函数的变步长自适应滤波算法

基于matlab的基于S函数的变步长自适应滤波算法&#xff0c;比传统的算法收敛速度更快。传统的LMS算法中&#xff0c;权值向量实时地被更新。这些更新可能会由于噪声的影响而变得不稳定。SVSLMS算法是一种改进的LMS算法&#xff0c;它采用了矢量处理的概念&#xff0c;利用信号和…

Qt中的QGraphicView和QGraphicScene简单使用

概述&#xff1a;我们利用QGraphicView和QGraphicScene来实现一个简单的视频播放器&#xff0c;然后上面悬浮一些操作的控件&#xff0c;看看怎么来实现。 1、CcTestVideoPlayer类 模拟播放器类&#xff0c;继承QGraphicScene 1.1 CcTestVideoPlayer.h #pragma once#include…

【低代码开发_RuoYi_框架】RuoYi框架_前端页面部署/搭建

开源软件的影响力 随着信息技术的快速发展&#xff0c;开源软件已经成为软件开发的趋势&#xff0c;并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点&#xff0c;使得越来越多的企业和个人选择使用开源软件&#xff0c;促进了软件行业的繁荣。然而&#xff0c;…

代码随想录刷题训练营day25:LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合

代码随想录刷题训练营day25&#xff1a;LeetCode(40)组合总和 II、LeetCode(216)组合总和III、LeetCode(17)电话号码的字母组合 LeetCode(40)组合总和 II 题目 代码 import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util…

高性能Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上&#xff0c;服务端server接收到IO请求后&#xff0c;是如何处理请求并最终进入业务流程的呢&#xff1f;这里不得不提到reactor反应堆模型。reactor反应堆模型来源于大师Doug Lea在 《Sacalable io …

linux下查看某个命令在哪里个安装包程序下,以ifconfig命令举例子

yum list | grep net-tools &#xff08;查看yum安装列表中有没有安装指定的软件工具&#xff09;

USB Series A and Series B 连接器的引脚定义

参考《Universal Serial Bus Specification, Revision 2.0, April 27, 2000》

C++——类和对象(2):构造函数、析构函数、拷贝构造函数

2. 类的6个默认成员函数 我们将什么成员都没有的类称为空类&#xff0c;但是空类中并不是什么都没有。任何类中都会存在6个默认成员函数&#xff0c;这6个默认成员函数如果用户没有实现&#xff0c;则会由编译器默认生成。 6个默认成员函数包括&#xff1a;负责初始化工作的构造…

python dictionary 字典

Python 字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号 {} 中 ,格式如下 d {key1 : value1, key2 : value2, key3 : value3 }dict 作…

RocketMQ入坑指南(五):SpringBoot集成RocketMQ和具体使用方式

前言 经过前面几部分的教程&#xff0c;大家应该已经对RocketMQ有了一个全面的认识&#xff0c;建议仔细阅读前几章的内容&#xff0c;可以更好的理解这次的内容&#xff0c;接下来&#xff0c;我们通过代码来演示一下SpringBoot如何集成并使用RocketMQ发送消息 一、SpringBo…