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

news2024/11/21 2:30:19

我们在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 捕获后继续执行。

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

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

相关文章

es性能强悍的推演过程

前言 es底层复用的Lucene的能力,Lucene在以前的文章中有所讲解,感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169771769916777224433628%2522%252C%2522scm%2522…

02-瑞吉外卖员工表的增删改查

添加员工信息 执行流程 第一步: 用户点击添加员工按钮跳转到add.html页面,然后在页面中输入要添加的员工的信息 第二步: 用户点击保存按钮发送Ajax请求将用户输入的员工信息以json的格式提交到服务端 第三步: 服务端Controller接收页面提交的json格式的数据并转化为java对象…

酷开系统 | 酷开科技:打造精彩纷呈的电影盛宴

对于许多人来说,观看电影是一种享受、一种放松、一种逃避现实的方式。而现在,酷开科技作为行业内领军企业,为我们带来了一种全新的居家观影体验,让电影不仅是一种娱乐方式,更是科技的展现。 酷开科技致力于为观众带来…

【MySQL日志与备份篇】数据库备份与恢复

数据库备份与恢复 文章目录 数据库备份与恢复1. 物理备份与逻辑备份2. mysqldump实现逻辑备份2.1 备份一个数据库2.2 备份全部数据库2.3 备份部分数据库2.4 备份部分表2.5 备份单表的部分数据2.6 排除某些表的备份2.7 只备份结构或只备份数据2.8 备份中包含存储过程、函数、事件…

金蝶云星空设置单据体行高

文章目录 金蝶云星空设置单据体行高表单插件Python脚本 金蝶云星空设置单据体行高 表单插件 新建类继承AbstractBillPlugIn,重写OnInitialize方法进行设置 public override void OnInitialize(InitializeEventArgs e){base.OnInitialize(e);this.View.GetControl&…

图片高清重建

图像超分辨率重建(super resolution,SR)是指利用计算机将一幅低分辨率图像(low resolution,LR)或图像序列进行处理,恢复出高分辨率图像(high resolution,HR)的一种图像处理技术。简单…

红海云签约湘湖实验室,助力科研机构人力资源数字化全面升级

湘湖实验室(农业浙江省实验室)是由浙江省农业科学院和萧山区人民政府共同举办的新型研发机构,定位为农业核心种质资源生物制造与生物互作科学问题和核心技术研究,瞄准世界农业科技发展前沿,面向国家重大战略&#xff0…

Qt执行带参sql

//准备执行的sql语句,此为带参的sql语句query.prepare("update employee set Name:Name, Gender:Gender,Height:Height,"" Birthday:Birthday, Mobile:Mobile, Province:Province,"" City:City, Department:Department, Education:Educati…

DeepFool: a simple and accurate method to fool deep neural networks

DeepFool: a simple and accurate method to fool deep neural networks----《DeepFool:一种简单而准确的欺骗深度神经网络的方法》 摘要 最先进的深度神经网络已经在许多图像分类任务上取得了令人印象深刻的结果。然而,这些相同的架构已被证明对于图像…

使用cmd运行控制面板工具

如何通过键入命令运行“控制面板”工具 - Microsoft 支持 windows自带管理工具(exe/cpl/msc)-CSDN博客 CMD下打开系统各面板_cmd打开轻松使用面板-CSDN博客 示例: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl 替换powercfg.…

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

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

uview的u-calendar日历组件,当设置了 minDate配置项后,会导致第一次打开日历弹窗,不会精准的滚动到选中的日期(设置了默认日期都没用)

发现需要给month.vue文件里的getMonth方法加一个延时器,猜测是因为设置最小日期后,日历没渲染完毕的时候就已经开始获取节点信息了

基于SSM的超市积分管理系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

从C语言到C++_40(多线程相关)C++线程接口+线程安全问题加锁(shared_ptr+STL+单例)

目录 1. C多线程 1.1 thread库 1.2 mutex库 1.3 RAII锁 1.4 atomicCAS 1.5 condition_variable 1.6 分别打印奇数和偶数 2. shared_ptr线程安全 2.1 库里面的shared_ptr使用 2.2 shared_ptr加锁代码 3. 单例模式线程安全 3.1 懒汉模式线程安全问题 3.2 懒汉模式最…

openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程

文章目录 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程122.1 创建并执行涉及加密列的函数/存储过程 openGauss学习笔记-122 openGauss 数据库管理-设置密态等值查询-密态支持函数/存储过程 密态支持函数/存储过程当前版本只支持sql和P…

初始Linux(五)(定时任务)

crontab 进行 定时任务的设置 概述: 任务调度:是指系统在某个时间执行的特定的命令或程序 任务调度分类: 1.系统工作:有些重要的工作必须周而复始的执行,如病毒扫描 2.个别用户工作: 个别用户可能希望执行某些程序,比如mysql数据库的备份 基本语法: crontab [选项] -e 表示…

CCF CSP认证历年题目自练Day45

这几天搞泰迪杯数据分析技能赛去了。等拿国奖了就出一期关于泰迪杯的。 题目 试题编号: 201703-3 试题名称: Markdown 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   Markdown 是一种很流行的轻量级标记…

11-13 周一 同济子豪兄CNN卷积神经网络学习记录

11-13 周一 同济子豪兄CNN卷积神经网络学习记录 时间版本修改人描述2023年11月13日14:02:14V0.1宋全恒新建文档2023年11月13日19:05:29V0.2宋全恒完成 大白话讲解卷积神经网络的学习 简介 为了深入理解CNN,进行B站 同济子豪兄深度学习之卷积神经网络的学习. 主要内…

加速mvn下载seatunnel相关jar包

seatunnel安装的时候,居然要使用mvnw来下载jar包,而且是从https://repo.maven.apache.org 下载,速度及其缓慢,改用自己本地的mvn下载。 修改其安装插件相关脚本,复制install-plugin.sh重命名为install-plugin-mvn.sh …

【数据分享】我国独角兽企业数据(excel格式\shp格式)

企业是经济活动的参与主体。一个城市的企业数量决定了这个城市的经济发展水平!比如一个城市的金融企业较多,那这个城市的金融产业肯定比较发达;一个城市的制造业企业较多,那这个城市的制造业肯定比较发达。 本次我们为大家带来的…