Vue中的数据代理

news/2024/5/15 5:42:38/文章来源:https://blog.csdn.net/weixin_45112114/article/details/127370380

什么是数据代理

数据代理:通过一个对象代理对另一个对象中属性的操作(读/写)。

想要更加深刻的理解什么是数据代理,就必须先了解JS中对象的一个方法:Object.defineProperty(),数据代理主要使用Object.defineProperty()的第三个参数中的setter和getter;对其不太了解的小伙伴可以看下小shy之前专门对Object.defineProperty()的讲解 Object.defineProperty()详解。

数据代理案例理解

举例:定义一个对象obj1,给obj1定义一个属性name,再定义一个对象obj2,想让obj2可以访问obj1中name的值,并且也可以修改obj1中的name。

代码如下:

const obj1 = { name: '孙悟空' };
const obj2 = {};Object.defineProperty(obj2, 'name', {// obj2访问obj1中name的值get() {return obj1.name;},// 修改obj1中name的值set(value) {obj1.name = value;}
})

效果如下:
访问数据:
在这里插入图片描述
修改数据:
在这里插入图片描述

Vue中的数据代理

vue中的数据代理原理和上述例子一样,也是使用了Object.defineProperty()来实现的,使用了其getter 和 setter。下面使用尚硅谷视频讲解来介绍下vue中是如何实现数据代理的。(如需观看视频可在b站搜索尚硅谷vue即可)

首先我们在data中定义一些数据

以下是vue文件

<template><div><h1>名称:{{name}}</h1><h1>地址:{{address}}</h1></div>
</template><script>
export default {components: {},data() {return {name: '尚硅谷',address: '北京'}},mounted() {console.log(this)}, 
}
</script>

我们在mounted中打印下this(vue实例对象),看看里面都有什么。
在这里插入图片描述
在这里插入图片描述
我们看到vue实例对象身上有这两个属性,但是一开始的状态是…(三个点),这三个点其实就表示的是该数据是通过Object.defineProperty()来创建的;当然在下面也可以看到name和address这两个数据的getter和setter。

不墨迹,直接开讲:
vue是怎么实现getter 和 setter的呢?
在data中定义name 和 address的时候有如下步骤:

  1. 在data中定义name 和 address的时候,vue实例对象在其自身添加了一个_data属性(可以理解为就是data),用来存储data中定义的name 和 address
    此时页面只能是通过_data.name的形式才能访问,但是上述代码并不是这样的,是直接访问vue实例对象中的name和address,有意思的来了;
  2. 这时候vue会在该vue实例对象上开始加东西(会将data中定义的数据都加到vue实例对象中),首先会先加一个name属性,name的值则是通过getter来读取_data中name的值如果修改vue实例对象中name的值,则通过setter映射到_data中的name来进行修改
  3. 同理address也是如此,这种通过getter 和 setter将_data中的数据放到vue实例对象中即为数据代理。(目的就是想让开发者编码相对比较方便一些)

vue数据代理图如下
在这里插入图片描述

总结

1.Vue中的数据代理:通过vm对象来代理data对象中属性的操作(读/写)
2.Vue中数据代理的好处:更加方便的操作data中的数据
3.基本原理:通过Object.defineProperty()把data对象中所有属性添加到vm (vue实例对象)上。为每一个添加到vm上的属性,都指定一个getter/setter。在getter/setter内部去操作(读/写)data中对应的属性。

问题

首先我们先看下_data中是什么样的。
在这里插入图片描述
我们会发现,_data中也存在数据代理,其实这里面并不是数据代理,而是数据劫持;其实这样做是为了实现响应式,当你修改了vue实例对象中的数据的时候,此时_data中的数据也随之发生了改变,页面中用到该数据的地方则会自动更新,如果想要实现这种效果,就需要让vue知道_data中的数据发生了改变,数据劫持就是来干这个事情的;这里先简单说下,后续会专门出一片文章来解释。

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

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

相关文章

构建性能测试知识体系

转载:https://mp.weixin.qq.com/s?__biz=MzkwNTI2NjAxMA==&mid=2247484048&idx=1&sn=6700370d90c5c5ceae2729297f6e8ef4&chksm=c0fb14a5f78c9db3ae1bd31e50a1253a95d2a97ae1888ee22025d0c5bed4bd86a63599dd36cb&scene=178&cur_album_id=233153993986…

《对线面试官》| 高频 Redis 面试题(上)

目录前言百分之99面试官都爱问的 Redis 面试题1、谈下你对 Redis 的了解2、Redis适用于哪些场景&#xff1f;不适用于哪些场景&#xff1f;3、Redis 支持的数据类型有哪些&#xff1f;4、既然Redis是单线程架构&#xff0c;但为什么这么快&#xff1f;5、什么是缓存穿透&#x…

星巴克急了,瑞幸就稳了?

&#xff08;图片来源于网络&#xff0c;侵删&#xff09; 文|螳螂观察 作者|易不二 新消费下行&#xff0c;但咖啡赛道却异常拥堵。 Manner正在不亦乐乎玩联名、Tims中国进入上市倒计时、茶颜悦色挤进了咖啡市场、幸运咖开始反攻一线...... 跨界的玩家们就更是从四面八方…

【Shell篇三】Shell数组

文章目录一、Shell数组的定义二、Shell数组的常用操作三、Shell数组的增删改查四、Shell数组的遍历一、Shell数组的定义 Bash Shell只支持一维数组定义时使用圆括号&#xff0c;元素用空格分开初始化数组时不需要定义数组的大小 eg: array(A 1 B "C" 3) array2()也…

voron 2.4 皮带张紧度调节

相关视频 【浅谈一下Voron2.4打印机,让入门者有个清晰的定位和了解】https://www.bilibili.com/video/BV1KL4y1N76C?share_source=copy_web&vd_source=4df36574d866076e5078105782af91de Z轴AB轴

(01)ORB-SLAM2源码无死角解析-(64) BA优化(g2o)→闭环线程:Optimizer::OptimizeSim3→Sim3变换优化

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析-接如下: (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/123092196 文末正…

白名单里的蓝桥杯“计算思维”竞赛到底考啥,有啥用处?

可能很多人都已经知道了&#xff0c;教育部公布的《2022-2025学年面向中小学生的全国性竞赛活动名单》正式宣告了&#xff0c;蓝桥杯全国软件和信息技术专业人才大赛成为了白名单比赛中的一员了。 而根据蓝桥杯的竞赛说明&#xff0c;2023年4月15~16日&#xff0c;以及4月22~2…

微信对接百度实现文字识别OCR

微信对接百度实现文字识别OCR 前置基础条件&#xff1a; ①注册测试账号 ②开通自己的测试公众号 ③完成与微信互发消息 ④完成自定义菜单栏 详细步骤&#xff1a;https://blog.csdn.net/weixin_45565886/category_12059118.html 1 获取到百度文字识别API ①注册百度智能云账…

Tomcat修改端口、添加域名访问

一、修改改端口 1、修改默认访问端口8080,改为80 # vim /usr/local/tomcat/conf/server.xml (路径是自己的安装目录)<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding=&…

spring 原理解析

spring 要解决的问题 1.spring 是如何创建一个bean对象的 bean对象其实就是一个实例 无非通过一些当时来丰富这个对象的内容 典型的就是aop和依赖注入 spring在通过构造方法创建一个实例对象后 就进入一个aop的阶段&#xff0c;这个阶段来实现属性 参数的依赖注入&#xf…

自然资源部第三地理信息制图院与Bigemap强强联手,共同推动多元化新GIS应用

近日&#xff0c;成都比格图数据处理有限公司(以下简称&#xff1a;Bigemap)与自然资源部第三地理信息制图院正式达成战略合作&#xff0c;未来双方将共同推动"基于矢量、影像、地形、实景三维等GIS数据在行业上的深化应用及国产化替代"合作。 自然资源部第三地理信…

小程序技术可助力智慧医疗企业破茧突围?

智慧医疗作为充分应用计算机技术、信息技术建立的新型医疗方式&#xff0c;正随着新一代信息技术的普及和医疗健康领域需求的变化迎来爆发期。智慧医疗作为充分应用计算机技术、信息技术建立的新型医疗方式&#xff0c;正随着新一代信息技术的普及和医疗健康领域需求的变化迎来…

基于java的果蔬在线销售系统/农产品销售系统

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要…

8-3 通过Grafana展示Prometheus的Node和Pod数据

文章目录前言Node数据node-exporter指标数据Prometheus采集node-exporter数据Grafana展示node-exporter数据导入模板Pod数据cadvisor指标数据Prometheus采集cadvisor数据Grafana展示cadvisor数据导入模板修改名字前言 在上一章节 8-2 通过Node-Exporter和Cadvisor收集指标数据…

多种点击试剂PEG:DBCO-PEG24-Maleimide, DBCO-PEG12-Mal性质总结

●中文名&#xff1a;二苯并环辛炔-PEG24-马来酰亚胺、二苯并环辛炔-二十四聚乙二醇-马来酰亚胺 ●英文&#xff1a;DBCO-PEG24-Maleimide&#xff0c;DBCO-PEG24-Mal ●外观以及性质&#xff1a;浅黄色或无色油性&#xff0c;西安凯新生物科技有限公司供应的​DBCO系列产品包…

MybatisPlus二级缓存不失效原因(缓存与数据库不一致)

​&#x1f4d2;个人主页&#xff1a;热爱生活的李&#x1f4d2; ​❤️感谢大家阅读本文&#xff0c;同时欢迎访问本人主页查看更多文章​❤️ &#x1f62d;技术太菜了希望下次不要出现了&#x1f62d; &#x1f64f;本人也在学习阶段&#xff0c;如若发现问题&#xff0c;请…

idea中的翻译插件(Translation)出现TKK不可用

idea中的翻译插件&#xff08;Translation&#xff09;不可用 1、问题&#xff1a; 在使用idea中的翻译插件时出现了下面的错误 2、解决方案 2-1、可以选择除谷歌外的 其他三个翻译软件 注意&#xff1a;我 试了一下 有道的 &#xff0c;申请了一个发现&#xff0c;这个并…

透明Png黑白图片上色(重新着色、改变成指定颜色)

场景&#xff1a;有时&#xff0c;我们需要给透明Png黑白图片改变成指定颜色&#xff08;上色&#xff09;。 前提&#xff1a;我们已经做好了带透明通道的PNG图片。 益处&#xff1a;使用此方法&#xff0c;只需要制作一张透明的黑色PNG图片即可&#xff0c;我们需要不同颜色…

UnRaid设备共用其他UnRaid主UPS的详细设置方法

系列文章目录 UnRaid系统添加UPS功能系列文章 第一篇&#xff1a;UnRaid主机连接UPS的设置方法简介 第二篇&#xff1a;UnRaid设备共用其他UnRaid主UPS的详细设置方法&#xff08;本文&#xff09; 第三篇&#xff1a;UnRaid设备共用群晖UPS的详细设置方法 文章目录系列文章目录…

Flutter基础组件:开关、进度组件、图片组件、图标组件

前言 刚开始学习&#xff0c;主要是为了熟悉一下组件的基本用法。参考 Flutter | 老孟 开关 Switch Switch(value: isOpen,onChanged: (value) {setState(() {isOpen value;});})添加图片 Switch(value: isOpen,activeThumbImage: const AssetImage(lib/assets/img/qq.png…