Vue3 数据响应式原理:Proxy和Reflect

我们在Vue2中使用的是Object.defineProperty方法来实现数据响应式的,可以通过get和set方法来监听对象的访问和修改。

但是并不能响应对象中属性的增加和删除,只能使用Vue.$set 和Vue.$delete 来对对象中的属性进行增加和删除。

数组也不能直接通过下标来对数组进行修改,只能使用Vue封装过的数组方法来实现数组的响应式。

以上问题在Vue3中就不会存在,因为其使用的是Proxy代理。

一、Proxy

Proxy和Object.defineProperty的作用类似,不过在使用上更加便捷。

(一)创建Proxy代理

如果我们先想要创建一个Proxy代理,就需要使用new 关键字:

let 代理对象 = new Proxy(源对象, {  // 配置项  })

如,我们对Person对象进行Proxy代理: 

let person = {
    name:"张三",
    age:18
}

let P = new Proxy(person, {});

代理完成后,我们在P中修改name属性,person的属性也会被修改,这就完成了数据代理。 

 

(二)Proxy配置项

以上我们只是实现了代理,但是还没有实现响应式,无法捕获到数据的增删改查。

我们只需要添加配置项即可:

读取数据:get (target, prop) {  // 响应  }

修改和添加数据:set (target, prop, value) {  // 响应  }

删除数据:deleteProperty (target, prop) {  // 响应  }

let P = new Proxy(person, {
    // 读取属性
    get(target, prop) {
        console.log(`读取了P的${prop}属性`);
    },
    // 修改和增加属性
    set(target, prop, value) {
        console.log(`修改或新增了P的${prop}属性,值为${value}`);
    },
    // 删除属性
    deleteProperty(target, prop) {
        console.log(`删除了P的${prop}属性`);
    }
});

现在我们对代理对象进行属性的增删改查都会触发响应式。 

还没完,代理对象中的数据变化了,但是还没引起源对象的变化,我们将上面的代码完善一下即可:

let P = new Proxy(person, {
    // 读取属性
    get(target, prop) {
        return target[prop];
    },
    // 修改和增加属性
    set(target, prop, value) {
        target[prop] = value;
    },
    // 删除属性
    deleteProperty(target, prop) {
        return delete target[prop]
    }
});

这下我们就能完成响应式了。 

二、Reflect

 reflect的作用就是对源对象中的属性进行操作。

读取数据:Reflect.get (源对象, 属性名)

修改或新增数据:Reflect.get (源对象, 属性名, 属性值)

删除属性:Reflect.deleteProperty (源对象, 属性名)

所以,我们就可以将上面的代码改为如下代码:

let P = new Proxy(person, {
    // 读取属性
    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);
    }
});

Vue3的源码底层实现就是使用的Proxy + Reflect 实现的。

使用Reflect主要是能够方便代码进行书写,使用Reflect 即使是语法错误,都会继续执行,不需要使用繁琐的try catch 捕获后继续执行。

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

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

相关文章

从单服务设计看SLA保证

文章首发公众号:海天二路搬砖工 0. 引言 在微服务架构中,谈到SLA保证,我们更多是从宏观的角度来需求解决方案。比如,通过合理服务拆分来增加系统整体的可维护性;通过多实例部署来保证系统的灾备。但是单个服务是可靠…

vivado产生报告阅读分析-常规报告1

“ Report Utilization ” ( 使用率报告 ) 报告有助于从层级、用户定义的 Pblock 或 SLR 层面来分析含不同资源的设计的使用率。在流程中各步骤间使用 report_utilization Tcl 命令生成“ Utilization Report ”。 以下显示的报告详细信息适用于 Ultr…

Oracle(2-2)Oracle Net Architecture

文章目录 一、基础知识1、Oracle Net Connections Oracle网络连接2、C/S Application Connection C/S应用程序连接3、OSI Communication Layers OSI通信层4、Oracle Protocol Support Oracle协议支持5、B/S Application Connections B/S应用程序连接6、TwoTypes JDBC Drivers 两…

半导体电导率受哪些因素影响?如何正确测量半导体电导率?

半导体的电导率直接影响着半导体器件的工作状态,是半导体材料的重要参数。因此,半导体电导率的检测也是半导体设计和制造过程中的关键环节,确保半导体器件的性能、稳定性和可靠性。 什么是半导体电导率? 半导体电导率是指导电流在单位时间和…

保姆级Decimal.js的使用(如何解决js精度问题)

精度问题控制台图样 如果银行的业务你这样做,不知道要损失多少钱,这样是不行的,计算的不准确是需要背锅的,我们给后端去做吧,其实我们前端也是可以做的,引入Decimal.js 01.引入Decimal.js decimal.js是使用…

2023.11.14-hive之表操作练习和文件导入练习

目录 需求1.数据库基本操作 需求2. 默认分隔符案例 需求1.数据库基本操作 -- 1.创建数据库test_sql,cs1,cs2,cs3 create database test_sql; create database cs1; create database cs2; create database cs3; -- 2.1删除数据库cs2 drop database cs2; -- 2.2在cs3库中创建…

2023NewStarCTF

目录 一、阳光开朗大男孩 二、大怨种 三、2-分析 四、键盘侠 五、滴滴滴 六、Include? 七、medium_sql 八、POP Gadget 九、OtenkiGirl 一、阳光开朗大男孩 1.题目给出了secret.txt和flag.txt两个文件,secret.txt内容如下: 法治自由公正爱国…

MT8788核心板主要参数介绍_联发科MTK安卓核心板智能模块

MT8788核心板是一款功能强大的4G全网通安卓智能模块,具有超高性能和低功耗特点。该模块采用联发科AIOT芯片平台。 MT8788核心板搭载了12nm制程的四个Cortex-A73和四个Cortex-A53处理器,最高主频可达2.0GHZ。它还配备了4GB64GB(2GB16GB、3GB32GB)的内存&a…

新生儿母乳过敏:原因、科普和注意事项

引言: 母乳过敏是一种较为罕见但可能令家长担忧的现象。母亲通常认为母乳是新生儿最安全、最适合的食物,然而有时候宝宝可能对母乳中的某些成分产生过敏反应。本文将科普新生儿母乳过敏的原因,提供相关信息,并为父母和监护人提供…

JTS: 20 InteriorPoint 内部中心点

文章目录 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 package pers.stu.algorithm;import org.locationtech.jts.algorithm.InteriorPoint; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; i…

OpenCV踩坑笔记使用笔记入门笔记整合SpringBoot笔记大全

springboot开启摄像头抓拍照片并上传实现&问题记录 NotAllowedErrot: 请求的媒体源不能使用,以下情况会返回该错误: 当前页面内容不安全,没有使用HTTPS没有通过用户授权NotFoundError: 没有找到指定的媒体通道NoReadableError: 访问硬件设备出错Ov…

CTFSHOW -SQL 注入

重新来做一遍 争取不看wp web171 基本联合注入 拿到题目我们已经知道了是sql注入 所以我们可以直接开始 第一题 不会难道哪里去 所以我们直接进行注入即可 1 and 12-- 1 and 11-- 实现闭合 -1unionselect1,2,3--%2b 查看字段数-1unionselect1,database(),3--%2b 查看数据…

初始MySQL(三)(合计函数,分组函数,字符串相关函数,数字相关函数,时间日期函数,加密函数,流程控制函数)

目录 合计/统计函数 count 返回行的总数 sum 合计函数 - avg group by 字符串相关函数 数学相关函数 时间日期相关函数 加密函数 流程控制函数 合计/统计函数 count 返回行的总数 Select count(*) | count (列名) from tablename [WHERE where_definition] #演…

答题猜歌闯关流量主小程序开发

视频互动答题是一款微信小程序游戏,以视频互动的形式进行答题,内容涵盖广泛,包括天文地理、生活百科、历史文化、综艺娱乐、数理知识等。 用户可以通过答题获得红包兑换余额,并有机会赢得豪华奖品。 设计风格:设计风格…

数据结构与算法之美学习笔记:18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

目录 前言散列思想散列函数散列冲突解答开篇 前言 本节课程思维导图: Word 的单词拼写检查功能,虽然很小但却非常实用。你有没有想过,这个功能是如何实现的呢?其实啊,一点儿都不难。只要你学完今天的内容,…

EXCEL——计算数据分散程度的相关函数

一、PERCENTIL函数 1.函数介绍 通常用来返回数据集给定百分点上的值。 2.函数解读 函数公式: PERCENTILE(数据, 百分点) 参数释义: 数据(必填):待处理的数组或数据区域。 百分点(必填)&…

mapboxGL中的底图切换

概述 底图切换,这么简单的功能还要写一篇文章?值得的,为什么这么说呢?因为mapboxGL的矢量底图有上百个,不同的底图用的样式、图层的名称、图层的内容、字体库、图标库都不一样,尤其是当地图上已经叠加了很…

2022年06月 Python(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 Python中 print(“八进制{: o}”.format(12)) 正确的输出结果是?( ) A: 八进制:O B: 八进制:O14 C: 八进制14O D: 八进制14 答案:D 字符串的format()格式。 第2题 下列的程…

计算机组成原理之概述

概述 计组主要讲的是计算机的硬件实现方式。 机器字长 比如8080处理器,如果想处理16位数的整数运算,就需要执行两次。 可见,机器字长会影响到数据的处理速度。 计算机硬件的基本组成 早期的冯诺依曼机 冯诺依曼提出了“存储程序”的概念&…

汽车FMCW毫米波雷达信号处理流程(推荐---基础详细---清楚的讲解了雷达的过程---强烈推荐)

毫米波雷达在进行多目标检测时,TX发射一个Chirp,在不同距离下RX会接收到多个反射Chirp信号(仅以单个chirp为例)。 雷达通过接收不同物体的发射信号,并转为IF信号,利用傅里叶变换将产生一个具有不同的分离峰…