前言

经过上一篇文章的学习,完成了 v-on 指令的实现,接下来我们来实现将数据代理到 Vue 实例上。

为什么要完成这个功能呢?因为我们在使用 Vue 的时候,可以直接通过 this.xxx 的方式来访问 data 中的数据,这样就不用每次都去访问 data 中的数据了,这样就方便了很多。

现在在 myFn 函数中,通过 this.xxx 的方式来访问 data 中的数据,发现访问得到的是 undefined,这是因为我们还没有实现将数据代理到 Vue 实例上。

myFn() {
alert('myFn被执行了');
console.log(this.name);
},

运行浏览器,点击 div,观察控制台输出,发现 this.name 的值为 undefined。

接下来我们来实现将数据代理到 Vue 实例上。

代码实现

在构建 Nue 实例的时候,将 data 中的数据代理到 Vue 实例上,单独创建一个 proxyData 方法,代码如下:

proxyData() {
for (let key in this.$data) {
Object.defineProperty(this, key, {
get() {
return this.$data[key];
}
});
}
}

proxyData 方法中,通过 for in 循环遍历 data 中的数据,然后通过 Object.defineProperty 方法将 data 中的数据代理到 Vue 实例上。

接下来在构建 Nue 实例的时候,调用 proxyData 方法,代码如下:

this.proxyData();

运行浏览器,点击 div,观察控制台输出,发现 this.name 的值为 BNTang,说明数据代理到 Vue 实例上成功了,这样我们就可以通过 this.xxx 的方式来访问 data 中的数据了。

手撕Vue-实现将数据代理到Vue实例的更多相关文章

  1. es6中的Proxy和vue中的数据代理的异同

    1:概述 1-1:Proxy 用于修改某些操作的默认行为,Proxy可以说在对对象进行各种访问或者操作的时候在外层进行一层拦截,在操作之前都需要经过这种拦截.proxy返回的是一个新对象,可以通过操作 ...

  2. vue中的数据代理原理

    const vm = new Vue({ data:{ name:'boos' } }) // 注意 :使用构造函数构建vue实例时,传入的是一个option对象,它包含了data,computed等 ...

  3. 数据代理Object.defineProperty()

    数据代理: 通过一个对象代理对另一个对象中属性的操作(读/写) 数据代理 Object.defineProperty() Object.defineProperty() 方法会直接在一个对象上定义一个 ...

  4. Vue学习之--------el与data的两种写法、MVVM模型、数据代理(2022/7/5)

    文章目录 1.el与data的两种写法 1.1.基础知识 1.2.代码实例 1.3.页面效果 2.MVVM模型 2.1. 基础知识 2.2 .代码实例 2.3.页面效果 3.数据代理 3.1. 基础知 ...

  5. 【vue】数据代理

    Object.defineProperty()方法 我们先来看几段代码 常用添加属性的方法,以添加age举例 ,点击查看代码 let person = { name: '张三', sex: '男', ...

  6. 8_vue是如何进行数据代理的

    在了解了关于js当中的Object.defineProperty()这个方法后,我们继续对vue当中的数据代理做一个基于现在的解析 建议观看之前先了解下js当中的Obejct.defineProper ...

  7. Vue08 数据代理

    1 说明 所谓"数据代理",是指 通过一个对象代理对另一个对象的属性进行读或写操作. 2 简单示例 2.1 代码 let obj = {x:100}; let obj2 = {y: ...

  8. MVVM模型 && 数据代理

    MVVM模型 观察发现 data中所有属性,最后都出现在vm身上 vm身上所有属性及Vue原型身上所有属性,在Vue模板中都可以直接使用 Vue中的数据代理 通过vm对象来代理data对象中属性的操作 ...

  9. vue的数据代理

    1. vue数据代理: data对象的所有属性的操作(读/写)由vm对象来代理操作2. 好处: 通过vm对象就可以方便的操作data中的数据3. 实现: 1). 通过Object.defineProp ...

  10. MySQL通过bin log日志恢复数据|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第二篇文章,今天介绍一下MySQL的二进制日志(bin log),注意不要和MySQL的InnoDB ...

随机推荐

  1. Typora 一行显示多图

    图片下显示说明 ![](https://pic.cnblogs.com/avatar/80824/20200328151729.png) <center style="font-siz ...

  2. FTP安全组设置

    放行FTP服务器 TCP 21端口及FTP服务器被动1024/65535端口

  3. OpenFeign FormData

    服务端接口代码如下: /** * 上传数据+实体信息 */ @RequestMapping("/upload") public String doctorAnalysis(Http ...

  4. Java FTP操作

    pom引用: <dependency> <groupId>commons-net</groupId> <artifactId>commons-net&l ...

  5. POJ1426: Find The Multiple

    题目: 给定一个正整数n,请编写一个程序来寻找n的一个非零的倍数m,这个m应当在十进制表示时每一位上只包含0或者1.你可以假定n不大于200且m不多于100位. 提示:本题采用Special Judg ...

  6. var _ I = (*T)(nil)

    学习的时候看到这样一行代码 var _ Codec = (*GobCodec)(nil) 查了一下后,得到该语句的作用为:检查GobCodec这个结构体是否实现了Codec这个接口 空白标识符_代表变 ...

  7. Vue大数据可视化(大屏展示)解决方案

    DataV:组件库基于Vue (React版) ,主要用于构建大屏(全屏)数据展示页面即数据可视化 官网地址: http://datav.jiaminghi.com/guide/#%E7%94%A8% ...

  8. Mysql 中 not in 的查询优化

    本文为博主原创,转载请注明出处: 最近做性能优化时,通过开启 MySQL 的慢日志查询配置,发现 有一条慢sql,在这里记录下分析和优化的过程. 该慢 sql 如下: select id from f ...

  9. 处理命令行main函数args参数

    引用 System.CommandLine 库(需要显示预览版才能看到) var fileOption = new Option<FileInfo?>( name: "--fil ...

  10. Go-环形链表

    package main import "fmt" // 环形单向链表 // 特征: 首尾相连 // 实现: 结构体 + 指针 // 1. 构建环形单向链表,类似单向链表,不过he ...