Vue学习——【第四弹】

news2025/1/18 17:01:55

前言

上一篇文章 Vue学习——【第三弹】 中我们了解了MVVM模型,这篇文章接着学习Vue中的数据代理

简单介绍

数据代理就是**一个对象(A)来代理对另一个对象(B)的属性操作(A一定要包含B)。**直接看定义大家可能觉得有些抽象,我们可以用代码来实现。

提到数据代理,我们会很容易想到一个重要的API:JavaScript中的Object.defineProperty() 方法

通过对JavaScript的学习,我们知道可以用Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性,它的语法是这样的:

Object.defineProperty(obj, prop, desc)

obj 需要定义属性的当前对象
prop 当前需要定义的属性名
desc 属性描述符

该方法的工作机制:
给对象添加属性值 value
给对象添加getter和setter
gettersetter用于对属性的读写进行监控

并且该方法还具有一些配置项,比如:

	enumerable:true,//enumerable用于控制属性是否可以枚举,默认值时false
   	writable:true,//该配置项可以控制属性是否可以被修改,默认是false
    configurable:true//该配置项可以控制属性是否可以被删除,默认值是false

那么接下来我们就来看看Object.defineProperty() 方法的使用方式:

 <!-- 数据代理:通过一个对象代理对另一个对象中的属性进行操作 -->
    <script type="text/javascript">
        let obj1 = {a:100}
        let obj2 = {b:200}
 // 当访问obj2.a的时候,就调用get函数,然后返回obj1中的属性a;当修改obj2.a时,obj1.a就会被修改
        Object.defineProperty(obj2,'a',{
            get(){
                console.log('obj1.a被读取')
                return obj1.a
            },
            set(value){
                console.log('obj.a被修改')
                obj1.a = value
            }
        })
    </script>

在控制台上操作:

在这里插入图片描述

Vue中的数据代理

我们知道Vue是渐进式的JavaScript框架,而Vue中的数据代理所调用的API就是Object.defineProperty() 方法,我们举几个例子,来观察一下Vue中的数据代理的实现:

<div id="demo">
        <h1>姓名:{{name}}</h1>
        <h2>地址:{{address}}</h2>

    </div>
    <script type="text/javascript">
        const vm = new Vue({
            el:'#demo',
            data:{
                name:'小明',
                address:'山东'
            }
        })
   </script>

控制台上操作:

在这里插入图片描述

我们在控制台发现了熟悉的两个属性——name和address,并且点开它们我们可以看到它们的值就是我们代码中的值;

前文提到使用Object.defineProperty() 方法时,getter() 和setter() 用于对属性的读写进行监控,我们不妨来验证一下Vue数据代理中的getter()和setter()

捕获data

在验证setter()函数的调用之前,我们先看一下如何去获取data:

当我们直接去获取data时发现控制台返回 undefined
在这里插入图片描述
这时候我们看一下我们写的代码:

    <div id="demo">
        <h1>姓名:{{name}}</h1>
        <h2>地址:{{address}}</h2>

    </div>
    <script type="text/javascript">
        const vm = new Vue({
            el:'#demo',
            data:{
                name:'小明',
                address:'山东'
            }
        })
   </script>

我们不难看出,vm中的data其实是vm配置对象中的一个属性,并非全局变量,因此我们无法通过vm.data直接获取data,这时候想要获取data,就需要用到vm._data进行获取:
在这里插入图片描述
并且我们发现,在vm._data中还出现了data中的name和address属性。

其实,这里的vm._data就是我们想要获取的data,比如我们举个例子来验证一下:

在这里插入图片描述

我们将含有name和address属性的data作为一个全局变量写在 vm 的外部,然后在Vue实例中写上一个data;再在控制台比较vm._data是否和data相同,结果是返回true,很明显,两者是相同的。

简单描述一下Vue中的数据代理的过程:
vm 拿到data中的数据后,放在了vm里的_data中。vm中的name和address代理了_data中的name和address。读取vm.name时,调用getter()方法,读取了_data中的name。
修改了vm中的name时,就会调用setter()方法去修改_data中的name。
如果不做代理,在“{{ }}”中须要这样写成“{{_data.xxx}}”的形式;通过Vue中的数据代理,我们就可以简化缩写内容,只需要些{{xxx}}的形式即可。

明白以上原理,我们就可以很容易明白在进行数据代理时对getter()和setter()的调用啦。

getter()

在这里插入图片描述在我们读取vm中的name属性时,负责对name进行读取的函数getter()就会被调用,然后执行对data中的name属性值进行读取。

setter()

在这里插入图片描述

并且在模板中的花括号里的内容我们都可以写成 _data.xxx 的形式,通过Vue的数据代理,我们就无需如此繁琐的写成_data.xxx的形式。

小结

通过代码的验证,下图可以为我们展现出Vue中的数据代理机制:

在这里插入图片描述

参考文献

Vue官方文档
MDN官方文档
Vue技能树
B站视频讲解

如有不足,感谢指正!

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

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

相关文章

网络编程

网络编程 1.1、概述 计算机网络&#xff1a; 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计…

第十一节 java中的线程类

java中常见类&#xff1a;字符串类 集合类 异常类 前面讲完了 程序&#xff1a;是含有指令和数据的文件&#xff0c; 被存储在磁盘或其他的数据存储 设备中&#xff0c;也就是说程序是静态的 代码。.c .java文件都放在外存里 获得资源获得CPU执行 这叫进程 程序和进程的…

【学习积累】Queue 与 ConcurrentQueue性能测试

在 C# 中&#xff0c;关于队列&#xff08;Queue&#xff09;有两种&#xff0c;一种就是我们普通使用的队列&#xff0c;另一种是线程安全的队列 ConcurrentQueue<T> 。 ConcurrentQueue表示线程安全的先进先出 (FIFO) 集合。https://learn.microsoft.com/zh-cn/dotnet…

【创作赢红包】python学习——【第七弹】

前言 上一篇文章 python学习——【第六弹】中介绍了 python中的字典操作&#xff0c;这篇文章接着学习python中的可变序列 集合 集合 1&#xff1a; 集合是python语言提供的内置数据结构&#xff0c;具有无序性&#xff08;集合中的元素无法通过索引下标访问&#xff0c;并且…

Qt框架概述

Qt框架概述一、什么是Qt二、了解QtCreator三、创建Qt项目*Qt项目框架及文件介绍四、设置窗口属性五、按钮创建按钮方式一按钮属性设置创建按钮方式二六、对象模型一、什么是Qt 概念&#xff1a; Qt是一个基于C的 跨平台的图形用户界面应用程序框架。 常见GUI Qt &#xff1a;…

状态错误 MSB8040,此项目需要缓解了 Spectre 漏洞的库。从 Visual Studio 安装程序(单个组件选项卡)为正在使用的任何工具集和体

“Spectre Mitigation”缓解错误 如果出现“Spectre Mitigation”这种错误&#xff0c;就要了解下PIPE技术&#xff1a;流水线技术&#xff0c;比如3级流水线&#xff0c;避免CPU空闲&#xff0c;不浪费时间&#xff0c;但是前提是没有跳转&#xff0c;指令都是顺序执行的&…

pytorch transforms图像增强

一、前言 在学习自己的项目发现自己有很多基础知识不牢&#xff0c;对于图像处理有点不太清楚&#xff0c;因此写下来作为自己的笔记&#xff0c;主要是我想自己动手写一下每一句代码到底做了什么&#xff0c;而不是单纯的我看了知道了它做了什么&#xff0c;说白了&#xff0c…

【Maven】开发自己的starter依赖

【Maven】开发自己的starter依赖 文章目录【Maven】开发自己的starter依赖1. 准备工作1.1 创建一个项目1.2 修改pom文件1.3 修改项目结构2. 动手实现2.1 创建客户端类2.2 创建配置类2.3 配置路径2.4 下载到本地仓库3. 测试1. 准备工作 1.1 创建一个项目 打开idea&#xff0c;…

BP神经网络原来就是曲线拟合

本站原创文章&#xff0c;转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com 在初学BP神经网络的时候&#xff0c;总是非常抽象和难理解 但是&#xff0c;学久了会发现&#xff0c;BP神经网络原来就是曲线拟合&#xff01; 一下子才具体、深入的理解到BP神经网络是什么 本文…

字节,腾讯过来的面试自动化测试就这水平吗?鬼知道经历了什么?

本人12年从业经验&#xff0c;曾就职于美团测试开发框架组&#xff0c;搭建过美团platuo测试框架&#xff0c;thrift测试框架&#xff0c;自动化测试平台&#xff0c;熟悉python3&#xff0c;java&#xff0c;vue&#xff0c;在多家公司从0到1搭建过自动化测试框架&#xff0c;…

linux文件编辑--vi

目录标题vi/vim中三种模式命令模式下的常用命令--光标移动输入模式末行模式vim中常用的操作类型命令行模式下的常用命令--复制、粘贴、删除命令模式下的常用命令--文件内容查找命令模式中的基本操作--撤销编辑及保存退出末行模式中的基本操作--保存文件内容及退出vi编辑器末行模…

GitHub标星15w,如何用Python实现所有算法?

学会了 Python 基础知识&#xff0c;想进阶一下&#xff0c;那就来点算法吧&#xff01;毕竟编程语言只是工具&#xff0c;结构算法才是灵魂。 新手如何入门 Python 算法&#xff1f; 几位印度小哥在 GitHub 上建了一个各种 Python 算法的新手入门大全。从原理到代码&#xf…

[论文阅读RGBD-SOD][2022_TCSVT_MoADNet][轻量化]

MoADNet: Mobile Asymmetric Dual-Stream Networks for Real-Time and Lightweight RGB-D Salient Object Detection paper&#xff1a;https://ieeexplore.ieee.org/abstract/document/9789193 动机 尽管已有许多优秀的RGB-D SOD技术被提出&#xff0c;但它们大多关注性能…

面试篇-从今天开始彻底分清Java内存模型JMM和运行时数据区

“相信很多人会把Java内存模型与Java运行时数据区给搞混淆” Java内存模型和Java运行时数据区是两个不同的概念&#xff0c;很容易让人混淆。下面简单介绍一下它们的区别&#xff1a; Java内存模型&#xff08;JMM&#xff09;是Java虚拟机规范中定义的一种内存模型&#xff…

如何优化快速排序?

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; 前言&#xff1a; 还记得上次的快速排序吗&#xff1f;还记得 key 是怎么取的吗&#xff1f;当时我直接把数组的起始元素作为了 key 值&#xff0c;其实这样做是有弊端的&#xff0c;试想&#xff1a;一个降…

SAP Business Technology Platform (BTP)的架构理解

查资料看到的&#xff0c;转一下&#xff0c;附上链接&#xff1a; SAP Business Technology Platform (BTP)的架构理解 长期以来&#xff0c;我在与客户和伙伴的沟通交流中发现大家依然对SAP业务技术平台 – SAP Business Technology Platform (以下简称BTP)纯有各种疑惑&…

webgl-图形非矩阵旋转

知识拓展 由&#xff08;x1,y1&#xff09;旋转β角度到&#xff08;x2,y2&#xff09; 根据圆极坐标方程 x1 r*cosα y1 r*sinα 可得 x2 r*cos(α β) r*cosα*cosβ - r*sinα*sinβ,因为x1 r*cosα&#xff0c;y1 r*sinα&#xff0c;所以x2 x1*cosβ -y1*sinβ…

如何进行移动设备资产管理

随着越来越多的移动设备进入和访问组织的企业资源&#xff0c;管理员必须监视和控制对企业数据的访问。与传统工作站不同&#xff0c;传统工作站位于企业的物理工作区内&#xff0c;移动设备从多个位置使用&#xff0c;从而使移动资产管理过程更加复杂。 什么是移动资产管理 …

java基础集合面试题

什么是集合 集合就是一个放数据的容器&#xff0c;准确的说是放数据对象引用的容器 集合类存放的都是对象的引用&#xff0c;而不是对象的本身 集合类型主要有3种&#xff1a;set(集&#xff09;、list(列表&#xff09;和map(映射)。 集合的特点 集合的特点主要有如下两点&…

LMKD分享

背景 Android是一个多任务系统&#xff0c;可以同时运行多个程序&#xff0c;一般来说&#xff0c;启动运行一个程序是有一定的时间开销的&#xff0c;因此为了加快运行速度&#xff0c;当你退出一个程序时&#xff0c;Android并不会立即杀掉它&#xff0c;这样下次再运行该程…