Vue3.0中的响应式原理

news2024/10/6 1:45:23

回顾Vue2的响应式原理

实现原理:

- 对象类型:通过 ``Object.defineProperty()``对属性的读取、修改进行拦截(数据劫持)。
- 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

Object.defineProperty(data, 'count', {
    get () {}, 
    set () {}
})

存在问题:

- 新增属性、删除属性, 界面不会更新。
- 直接通过下标修改数组, 界面不会自动更新。

 添加之前是undefined,添加之后页面是有数据的,但是页面并没有展示,因为直接这样操作数据,通过defineProperty它是检测不到的

当然在v2中也是能修改的,需要使用$set这个api 

 

 删除这个数据,我们发现跟上面一样,页面上没有变化,但是数据发生改变

 也就是我也需要通过api的方式

 数组也存在上述的问题 

Vue3的响应式原理--Proxy

而v3中不存在v2的问题 

这是为什么呢?这就要说到v3的响应式原理了

首先模拟Vue2中实现响应式

let p = {}
			Object.defineProperty(p,'name',{
				configurable:true,
				get(){ //有人读取name时调用
					return person.name
				},
				set(value){ //有人修改name时调用
					console.log('有人修改了name属性,我发现了,我要去更新界面!')
					person.name = value
				}
			})
			Object.defineProperty(p,'age',{
				get(){ //有人读取age时调用
					return person.age
				},
				set(value){ //有人修改age时调用
					console.log('有人修改了age属性,我发现了,我要去更新界面!')
					person.age = value
				}
			})

这个确实能实现响应式数据,但是有弊端,对于新添加的或删除的数据没有办法捕获

模拟Vue3中实现响应式

想要写v3中的响应式,首先我们要知道window上面的Proxy 

 Proxy - JavaScript | MDN (mozilla.org)

 注意的一点,这个代理对象,的第二个参数不能不写。宁愿给它空对象

 

 最重要的是你对他进行增删改查的操作,他都能捕获到。

如果我们想要操作数据的时候,响应式的回复我们内容,我们可以对这个空对象进行设置

 说一下

get(target,propName){}有俩个参数,第一个是target指的是源数据对象person,第二个是propName就是我们读取的属性,例如p.name name就是propName

其中,为什么return要用[]这是因为动态为对象添加属性是,只能用中括号

js对象取值的两种方式(点和中括号)_js获取对象的值_小太阳...的博客-CSDN博客

set(target,propName,value){}而set就有三个参数,第一,二个跟上面一样。第三个是我们修改的值 

 有人删除p的某个属性时调用

deleteProperty(target,propName){

                    console.log(`有人删除了p身上的${propName}属性,我要去更新界面了!`)

                    return delete (target[propName]

                }

 

Vue3的响应式原理--Reflect

在vue3底层当然不是用我们这么土的办法,该什么底层数据啊。

除了,普通点语法能获取对象的值,还有window.Reflect(es6)也能实现

Reflect.get()能获取对象的值

 

Reflect.set()能修改对象的值

 

Reflect.delete()可以删除一个对象的值 

当然用这个方式实现太麻烦了,那为什么要设计这个东西呢?

其实我ECMA这个脚本组织,现在正把Object中的一些api移接到Reflect

v3就是通过一个代理,一个反射 

总结:

实现原理

- 通过Proxy(代理):  拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。
- 通过Reflect(反射):  对源对象的属性进行操作。

MDN文档中描述的Proxy与Reflect:

- Proxy:Proxy - JavaScript | MDN (mozilla.org)
- Reflect:Reflect - JavaScript | MDN (mozilla.org)

new Proxy(data, {
	// 拦截读取属性值
    get (target, prop) {
    	return Reflect.get(target, prop)
    },
    // 拦截设置属性值或添加新属性
    set (target, prop, value) {
    	return Reflect.set(target, prop, value)
    },
    // 拦截删除属性
    deleteProperty (target, prop) {
    	return Reflect.deleteProperty(target, prop)
    }
})

reactive对比ref

从定义数据角度对比:
  ref用来定义:基本类型数据
  reactive用来定义:对象(或数组)类型数据
  备注:ref也可以用来定义对象(或数组)类型数据, 它内部会自动通过 ``reactive``转为`<stro代理对象
从原理角度对比:
  ref通过 ``Object.defineProperty()``的 ``get``与 ``set``来实现响应式(数据劫持)。
  reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。
从使用角度对比:
  ef定义的数据:操作数据需要``.value``,读取数据时模板中直接读取不需要``.value``。
  reactive定义的数据:操作数据与读取数据:均不需要``.value``。

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

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

相关文章

jekins部署java和vue

一、安装jekins&#xff0c;下面安装的是2.387.2版本 必须安装有jdk11或jdk17 二、部署java项目 1.安装插件&#xff1a;Maven Integration plugin和Deploy to container Plugin 2.配置全局环境变量&#xff1a;jdk、git、maven 3.创建maven项目 cd docus-server/docus-serv…

深入底层谈谈String

深入底层谈谈String一、聊聊字符串拼接【底层】二、聊聊String实现&#xff08;源码分析&#xff09;实现的接口内部属性及其部分构造函数部分方法说明明明replace&#xff0c;replaceAll&#xff0c;substring等方法得到了新的字符串&#xff0c;为什么说String是不变的呢&…

kali设置静态ip地址

Kali设置静态ip地址 本篇文章主要分3部分讲解如何为Kali虚拟机配置静态IP地址&#xff0c;使其能够与主机和外网进行通信。首先需要配置VMware的虚拟网卡&#xff0c;然后配置Kali虚拟机&#xff0c;最后配置主机。 一、配置VMware 打开VMware&#xff0c;选择【编辑】—【虚…

C++游戏分析与破解方法介绍

1、C游戏简介 目前手机游戏直接用C开发的已经不多&#xff0c;使用C开发的多是早期的基于cocos2dx的游戏&#xff0c;因此我们这里就以cocos2d-x为例讲解C游戏的分析与破解方法。 Cocos2d-x是一个移动端游戏开发框架&#xff0c;可以使用C或者lua进行开发&#xff0c;也可以混…

Spring框架核心与设计思想

文章目录一、Spring是什么&#xff1f;二、什么是IoC容器&#xff1f;什么是IOC&#xff1f;Spring IoC三、DI总结一、Spring是什么&#xff1f; 我们一般所说的Spring指的是Spring Framework(Spring 框架)&#xff0c;它是一个开源的框架&#xff0c;Spring支持广泛的应用场景…

Spring事务详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;Spring事务详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光…

贯穿设计模式第三话--依赖倒转原则

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏&#xff0c;大家好呀&#xff0c;我是最爱吃鱼罐头&#xff0c;大家可以叫鱼罐头呦~&#x1f973;&#x1f973;&#x1f973; 从今天开始&#xff0c;将…

【GPT4】GPT4 官方报告解读

欢迎关注【youcans的AGI学习笔记】原创作品 【GPT4】GPT-4 官方报告解读1. GPT-4 官方介绍2. GPT-4 的性能2.1 GPT-4 在各种学术和专业考试中的性能2.2 GPT-4 在传统机器学习测试中的性能2.3 GPT-4 在不同语言测试中的性能3. GPT-4 的图像输入功能3.1 GPT-4 图像输入案例3.2 GP…

《分解因数》:质因数分解

目录 一、题目&#xff1a; 二、思路&#xff1a; 三、代码&#xff1a; 一、题目&#xff1a; 分解因数 《分解因数》题目链接 所谓因子分解&#xff0c;就是把给定的正整数a&#xff0c;分解成若干个素数的乘积&#xff0c;即 a a1 a2 a3 ... an,并且 1 < a1…

<数据结构> 链表 - 单链表(c语言实现)

B.最简单结构的链表——不带哨兵位单链表的实现&#xff08;关于哨兵位结点&#xff09; 一、不带哨兵位单链表结点的创建1.1 typedef 链表的数据类型 1.2 结点的结构体创建 二、单链表要实现的功能 三、需要包含的头文件四、函数接口一览为什么有些函数参数传递的是二级指针&a…

【FreeRTOS(二)】FreeRTOS新手入门——计数型信号量和二进制信号量的基本使用并附代码解析

写在前面&#xff1a; 本文章如有错漏之处&#xff0c;敬请指正&#xff0c;另外本文为网络材料整理&#xff0c;侵删。 FreeRTOS信号量的基本使用&代码解析一、信号量概述二、计数型信号量三、二进制信号量四、信号量函数API1、创建信号量2、删除一个信号量3、信号量释放4…

ASP.NET动态Web开发技术第5章

第5章数据验证一.预习笔记 1.验证控件概述&#xff1a; 2.RequiredFieldValidator&#xff08;必填验证&#xff09; 常用属性1&#xff1a;ControlToValidator:被验证的输入控件的ID 常用属性2&#xff1a;Text&#xff1a;验证失败时&#xff0c;验证控件显示的文本 常用…

8.3 总体分布的假设检验

学习目标&#xff1a; 如果我要学习总体分布的假设检验&#xff0c;我会采取以下步骤&#xff1a; 掌握基础概念&#xff1a;学习和掌握统计学中基础的概念&#xff0c;如总体、样本、假设检验、p值等等。 学习检验方法&#xff1a;了解和学习不同的总体分布假设检验方法&…

亚信科技AntDB数据库荣膺第十二届数据技术嘉年华(DTC 2023)“最具潜力数据库”大奖

近日&#xff0c;亚信科技AntDB数据库产品在第十二届数据技术嘉年华&#xff08;DTC 2023&#xff09;峰会上斩获“2022年度最具潜力数据库”大奖。亚信安慧副总裁张桦先生受邀参会&#xff0c;并发表了《AntDB数据库通信行业核心系统应用与创新》的主题演讲&#xff0c;分享了…

vue实现好看的相册、图片网站

目录 一、效果图 1.项目访问地址 2.画虫官方效果图&#xff1a; 3.作者实现的效果图&#xff1a; 二、代码实现 1.项目结构截图 2.路由配置代码&#xff1a; 3. 头部底部主页面内容显示容器的代码 4.首页&#xff0c;即标签页的代码 三、项目启动说明 四、总结 一、…

Android---MVC/MVP/MVVM的演进

目录 一个文件打天下 一个文件--->MVC MVC--->MVP MVP--->MVVM 6大设计原则 完整demo 我们通过"#字棋"游戏来展现MVC-->MVP-->MVVM 之间的演进 一个文件打天下 数据、视图以及逻辑都放在一个 class 里面。而一个 class 里最多 500 行代码&…

springboot 密码加密

首先介绍一下jasypt的使用方法 版本对应的坑 使用的时候还是遇到一个坑&#xff0c;就是jasypt的版本与spring boot版本存在对应情况。可以看到jasypt是区分java7和java8的&#xff0c;也存在依赖spring版本的情况。 自己尝试了一下 在使用jasypt-spring-boot-starter的前提…

优思学院|职场达人有什么晋升秘诀?

作为职场人士&#xff0c;升职晋升是我们一直追求的目标。然而&#xff0c;在职场中&#xff0c;竞争是激烈的&#xff0c;只有那些真正做到了突出表现和积极进取的人才能获得晋升机会。这里将分享七个职场达人的晋升秘诀&#xff0c;希望对那些正在寻找升职机会的人有所帮助。…

Python圈的普罗米修斯——一套近乎完善的监控系统

文章目录前言一、怎么采集监控数据&#xff1f;二、采集的数据结构与指标类型2.1 数据结构2.2 指标类型2.3 实例概念2.4.数据可视化2.5.应用前景总结前言 普罗米修斯(Prometheus)是一个SoundCloud公司开源的监控系统。当年&#xff0c;由于SoundCloud公司生产了太多的服务&…

SQL综合查询下

SQL综合查询下 目录SQL综合查询下18、查询所有人都选修了的课程号与课程名题目代码题解19、SQL查询&#xff1a;查询没有参加选课的学生。题目代码20、SQL查询&#xff1a;统计各门课程选修人数&#xff0c;要求输出课程代号&#xff0c;课程名&#xff0c;有成绩人数&#xff…