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

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

第二部分-实现响应式(2):(对应课程的第6-9节)

第6节:《实现proxy代理以及解决重复代理的问题》

1、在入口文件中暴露4个响应式API接口:

在这里插入图片描述

2、既然是从当前文件夹下的reactive中引入的这4个接口并暴露,那么接下来在当前文件夹下新建reactive.ts,并在其中编写代码:
定义并暴露了这4个方法,这4个方法都接收一个target入参,然后在函数内部又返回了一个createReactiveObj函数,此函数是实现响应式的核心方法,它接收三个参数:target(传入的参数)、isReadonly(是否只读)、baseHanlers(实现响应式的配置对象)
在这里插入图片描述

3、接下来编写createReactiveObj函数,这个方法是实现响应式的核心方法,首先需要判断数据是否对象类型,先在shared文件夹下定义一个公共方法 isObject:

在这里插入图片描述

4、由于在shared里面添加了公共方法,需要运行npm run build 进行打包才能将shared下的代码也进行打包(因为我们前面配置的npm run dev 只会对reactivity下的内容进行打包):

5、打包完成之后会发现packages/shared下已经出现了打包生成的文件,其中已经有了我们刚刚写的isObject方法:

在这里插入图片描述

6、打包之后运行一下 yarn install,重新安装一下,然后会发现 node_modules/@vue/shared 下会出现刚刚打包的 isObject 相关代码:

在这里插入图片描述

在这里插入图片描述

小总结:在shared里新增公共方法后,需要运行 npm run build 进行打包,将代码打包到packages下,然后需要运行 yarn install 重新安装,将代码同步到node_modules/@vue/shared下,之后才可以引用其中的方法。

7、引入isObject公共方法:

在这里插入图片描述

8、处理一个问题:假如一个已经被reactive处理过的数据,再次传递给了reactive,此时需要判断一下,如果这已经是一个被reactive处理过的数据,则直接返回处理后的数据,无需再次重复处理。实现方式为:用一个 weakMap 数据结构将reactive处理过的数据记录下来,在处理之前,先来判断一下这个存储被处理过的数据的结构中是否有这个数据,有则直接返回,无则进行处理并记录到weakMap数据集中。

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

第7节:《实现代理proxy中的get》

1、将4个响应式API对应的hander移动到一个单独的文件 baseHandlers.ts 中,并在reactive.ts中导入和使用:
在这里插入图片描述

2、在 baseHandlers.ts文件中定义并导出这4个handlers对象,由于4个handler都会包含一个get方法和一个set方法,所以仍然采用柯里化的形式,用一个createGetter函数,来统一处理相同的逻辑,通过传入不同的参数控制不同的逻辑:

在这里插入图片描述

3、编写createGetter公共方法:这个方法返回一个get函数,其参数为target(传递给4个响应式API的需要处理的对象数据)、key(读取的对象属性)以及receiver。在这个函数中,首先通过Reflect取到目标对象的属性值,然后根据不同参数进行判断:如果不是只读,那么通过effect进行收集依赖,相当于vue2中的watcher;如果是浅的,则直接返回属性值,因为Proxy默认只会对目标对象的第一层实现代理,并不会自动去处理嵌套的更深层级。最后将属性值返回,代码如下:

在这里插入图片描述

补充:Proxy的handler对象中get函数接收到的第三个参数receiver,经测试就是生成的Proxy对象:

在这里插入图片描述

在这里插入图片描述

4、通过Proxy对对象实现代理,默认只会对对象第一层进行代理;对比vue2,初始时如果遇到对象属性值又是对象,则会跑递归,给所有嵌套属性都实现watcher,即数据的“监听”

在这里插入图片描述

5、处理对象的属性值又是一个对象的情况:判断其属性值是对象类型,则递归调用响应式方法,如果是只读的,则继续调用readonly;如果不是只读,则继续调用reactive。

在这里插入图片描述

注意:这里的面试点:懒代理。这里不像vue2初始时就直接遍历跑递归,将对象的所有嵌套属性全部层层递归实现watcher,vue3的这种处理方式称为“懒代理”,只在用到了这个属性时(模板读取这个属性值时),才会去判断该属性值是否对象,如是才会去将该属性值对应的对象处理为Proxy响应式对象;如果没有用到这个属性,则不会去实现这个属性值对应的对象的响应式处理。这样的处理方式大大提高了性能。
vue3相对vue2实现响应式有什么不同,对性能提升有什么帮助?首先,vue3通过proxy实现对目标对象的代理,从而实现响应式。在通过proxy对目标对象代理的过程中,默认只会对对象第一层数据进行代理,如果不会读取或使用嵌套的对象属性值,则不会对嵌套的对象属性值进行代理,只有当使用嵌套的对象属性值时,才会对其进行代理。这样的处理方式大大提高了性能。

第8节:《实现响应式》

1、实现Proxy的handler中的set方法:
由于reodonly与shallowReadonly不能设置值(视频课程里应该是没考虑shallowReadonly的浅层次只读),所以在这两个方法对应的handler中的set方法里,直接打印一个提示信息:设置值失败
在这里插入图片描述

2、在packages文件夹下新建examples,新建1.reactive.html文件,引入打包后的reactivity文件,测试刚刚实现的reactive方法:

在这里插入图片描述

在这里插入图片描述

测试readonly方法:
在这里插入图片描述

在这里插入图片描述
测试 shallowReactive :

在这里插入图片描述

在这里插入图片描述

3、实现 reactive 与 shallowReactive 中Proxy对象handler中的set方法编写,统一用一个createSetter方法来处理:

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

第9节:《回顾上节课的知识点》

完善笔记:
在这里插入图片描述

在这里插入图片描述

优化代码,对象合拼:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于DPU和HADOS-RACE加速Spark 3.x

背景简介 Apache Spark(下文简称Spark)是一种开源集群计算引擎,支持批/流计算、SQL分析、机器学习、图计算等计算范式,以其强大的容错能力、可扩展性、函数式API、多语言支持(SQL、Python、Java、Scala、R&#xff09…

SAP PO接口行项目json缺少中括号[]问题

PO接口小问题问题:如果需要同时传输DATA与ITEM,此处选择很重要,如果选择:HTTP Header ITEM将缺少[].需要注意 PO接口小问题 问题:如果需要同时传输DATA与ITEM,此处选择很重要,如果选择&#…

一次奇怪的事故:机器网络连接打满,导致服务不可用

业务背景 发生事故的业务系统是一个toB业务,业务是服务很多中小企业进行某项公共信息指标查询。系统特点:业务处理相对简单,但是流量大,且对请求响应要求较高: 业务请求峰值qps达50w,平时流量达20w左右。 请求响应时…

中国专家主导的ISO隐私计算国际标准立项,蚂蚁链摩斯参与编写

蚂蚁集团联合阿里巴巴、中科院信工所等单位联合推动的ISO/IEC 4922-3(Information security -- Secure multiparty computation -- Part 3: Mechanisms based on garbled circuit )正式通过ISO/IEC JTC 1 SC27的International standard (IS, 国际标准&am…

电机效率MAP图

直接使用contourf,需要有[X,Y] meshgrid(x,y), 并用Zf(X,Y)来生成Z轴。但是如果一开始Z轴坐标就不是x,y用函数生成的,而是有个默认的测试数据,又该如何用来画MAP图呢? clc;clear;clf; data_ECO []; //具体数值可以自己填,此处…

浅谈JAVA中锁的优化机制

引言: 从JDK1.6版本之后,synchronized本身也在不断优化锁的机制,有些情况下他并不会是一个很重量 级的锁了。优化机制包括自适应锁、自旋锁、锁消除、锁粗化、轻量级锁和偏向锁。 锁的状态从低到高依次为 无锁->偏向锁->轻量级锁->重…

uniapp的微信小程序授权头像昵称(最新版)

前面我出过两期博客关于小程序授权登录,利用php实现一个简单的小程序授权登录并存储授权用户信息到数据库的完整流程。无奈,小程序官方又整幺蛾子了。wx.getUserInfo接口收回,wx.getUserProfile接口也不让用。导致我的个人小程序:梦缘 的授权…

(每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第12章 项目质量管理(一)

博主2023年11月通过了信息系统项目管理的考试,考试过程中发现考试的内容全部是教材中的内容,非常符合我学习的思路,因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家,希望更多的人能够通过考试&a…

系统攻防-WindowsLinux远程探针本地自检任意代码执行权限提升入口点

知识点: 1、远程漏扫-Nessus&Nexpose&Goby 2、本地漏扫(提权)-Wesng&Tiquan&Suggester 3、利用场景-远程利用&本地利用&利用条件 一、演示案例-操作系统-远程漏扫-Nessus&Nexpose&Goby Nessus Nessus号称是世界上最流行的漏洞扫描…

2024年江苏事业单位招聘报名指南

江苏事业单位目前已出的公告中&#xff0c;扬州和常州的报名时间相对较早&#xff0c;2月27日就开始报名了&#xff1b;其他大多在2月28日或3月1日起开始报名。 报名请移步<江苏人事考试网> 【报名时间】 2月28日9:00-3月4日16:00#图文万粉激励计划# 【资格初审】2月28…

Shiro反序列化漏洞原理代码分析(3)

最终POC transform链POC 由于我们要序列化的对象是PriorityQueue&#xff0c;所以我们就先实例化一个该对象 并且赋初值 PriorityQueue priorityQueue new PriorityQueue(2);priorityQueue.add(1);priorityQueue.add(2); 由于我们最后要调用的是ChainedTransformer对象的tr…

ADS-B Ground Receiver Radarcape

目录 Radarcape ADS-B MLAT Receiver Web Browser User Interface Radarcape Technical Data Radarcape Software Features Radarcape Basics Radarcape ADS-B MLAT Receiver Radarcape is a professional ADS-B receiver made for 24/7 operation. High performance rec…

C# TesseractOCR识别身份证号

https://github.com/tesseract-ocr/tessdata 新建控制台项目并添加包 Tesseract和Tesseract.Drawing 下载训练的模型 地址 代码实现 using Tesseract;var filePath "F:\\Desktop\\韦小宝.png"; var exePath AppDomain.CurrentDomain.BaseDirectory; var …

敏捷开发中如何写好用户故事?

什么是用户故事&#xff1f; 用户故事&#xff08;user story&#xff09;是一个用来确认用户和用户需求的简短描述&#xff0c;作为什么用户&#xff0c;希望如何&#xff0c;这样做的目的或者价值何在。用户故事在软件研发中又被描述为需求。用户故事通常的格式为&#xff1…

人工智能、机器学习和生成式人工智能之间有什么区别?

文 | BFT机器人 在这个数字的智能时代&#xff0c;大家对人工智能、机器学习和生成式人工智能这些名词字眼很熟悉&#xff0c;有些人或许对它们还有一些了解&#xff0c;但是当他们一起出现的时候&#xff0c;大家能够区别它们是什么意思吗&#xff1f;今天小编将带你们详细解…

Spring6学习技术|事务

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; 事务 什么是事务&#xff1f;好像是数据库部分的词&#xff0c;我自己的理解是对数据库进行的操作序列&#xff0c;要么一起完成&#xff0c;要么都不完成…

vue-router4 (一)vite安装并构建项目

1、使用vite构建项目&#xff0c;cmd运行 npm init vitelatest 2、安装vue-router (Vue2安装对应的router3版本&#xff1b;Vue3 安装对应的router4版本) npm install vue-router -s 构建步骤截图如下&#xff1a; 注&#xff1a; vue2使用vetur vue3使用volar 这两个插件…

微信公众号关键词自动回复

今天主要给大家讲一下如何实现微信公众号关键词的自动回复功能&#xff0c;就如网站的文章而言&#xff0c;进行人机识别&#xff0c;需要关注公众号回复验证码获取到验证码从而展示文章内容&#xff0c;&#xff0c;具体效果如下图。 springboot 2.3.2RELEASE 1、微信公众平台…

Spring全面精简总结

Spring两大核心功能&#xff1a;IOC控制反转、AOP面向切面的编程 控制反转(loC&#xff0c;Inversion of Control)&#xff0c;是一个概念&#xff0c;是一种思想。指将传统上由程序代码直接操控的对象调用权交给容器&#xff0c;通过容器来实现对象的装配和管理。控制反转就是…

电感电流波形分析

电感电流波形分析 首先&#xff0c;当电感充电时候&#xff08;红色回路&#xff09;电感左右两端是左正右负 假设在初始状态下&#xff0c;电容两端电压是0V&#xff0c;可以看出来A点电位是400V&#xff0c;B和C两端电容也都是0V 根据电感表达式di/dtUL/L400V/L 所以看得出…