arduinowifi.send怎么获取响应_Vue3.0 响应式原理 (一)

35da7bd8472712f4e981e375d7a86863.png

前几天,回顾整理下关于vue2.0的响应式原理。温故而知新么,那么今天,整理了一下关于vue3.0的响应式原理,利用 JavaScript 来写的。本着尽可能的清晰易懂的原则,所以,可能会分几篇文章来发布。那现在开始上菜。


盘它!


敲黑板,面试必问,你觉得vue2.0 和vue3.0 的区别;或者说,你觉得vue3.0比vue2.0好在哪儿? 如果你只说 vue2.0 是基于Object.definePropery, vue3.0是基于Es6的proxy来架构的,仅此而已的话,那显然是不够的。

  • 首先我们说vue2.0 有哪些缺点或者说不足吧!
  1. 递归,大量的递归,如果数据嵌套层级过多,会特别的消耗内存资源,性能不好
  2. 更改数组,改变数组的长度是无效的
  3. 对象不存在的属性是不能被拦截的

Vue3.0 手撸版开撸

首先来说我们要知道,vue3.0的响应式数据,是怎么搞的

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vue3 原理</title>
</head>
<body><script src="vue.global.js"></script><script>  let proxy = Vue.reactive({name: 'bryant'});// 副作用 Vue.effect 默认会先执行一次,先打印出 'bryant',而后 proxy.name 的值发生改变,则会在执行一次 打印出 'wzy'Vue.effect(()=> {console.log(proxy.name)})proxy.name = 'wzy'proxy.name = 'yolin'</script>
</body>
</html>

是代码中的这个 Vue.reactive({name: 'bryant'})这个api 是吧!

那么我们创建一个js文件,定义一个这样的函数

// 1.响应式的核心方法function reactive(target) {// 创建响应式对象return createReactiveObject(target)
};
// 2. 创建响应式对象
function createReactiveObject (target) {if(!isObject(target)){return target; // 判断如果不是对象那就直接把他返回出去;};// 创建一个观察者, 此处是vue3的核心了,不在使用object.defineProperty 而是是用来自ES6的 proxy;// baseHandle 对象中就存放一些,拦截的函数了,比如get set方法等;let baseHandle = {// 形参中的target 值得是原对象,指的是下面定义的 let data = {name: 'wzy'};,key 指的是你要获取的某个属性// receiver 指的是下面的proxy, 也就是data 被代理后的对象get(target,key, receiver) {console.log('获取');// 理论上取值的话是这样的// return target[key];// 但是在vue3中 proxy 是和一个新的api结合使用的 reflect 反射let result = Reflect.get(target,key,receiver);return result;},set(target,key,value,receiver) {console.log('设置');let flag = Reflect.set(target,key,value,receiver); // 返回的是一个布尔类型,ture && false 告诉设置是否成功return flag;},deleteProperty(target,key) {console.log('删除');let res = Reflect.deleteProperty(target,key);return res;}};let observer = new Proxy(target, baseHandle); return observer;
};
// 3. isObject(); 该函数就是判断是不是对象function isObject(val) {return typeof val === 'object' && val !== null;
};

简单说一下: 首先reactive函数里面return的 createdReactiveObject() 函数,是创建响应式的主体,

首先在c函数中先判断传进来的数据是否为对象,如果不是对象,就return出去,是对象的话,则声明一个变量,来接受Proxy的实例,并且把这个对象传给 Proxy();
如果对 Proxy 不是很了解的同学,可以去读一下阮一峰老师的Es6很详细。


那么简单的说下Proxy, 利用Proxy可以对,所要操作的对象,架设一层拦截,在这个拦截中,可以做一些我们想做的事情。那么,它所接受的第一个参数,则是要操作的目标对象数据,那么第二个参数,也是对象类型,那么在这个对象里面则是一些关于可以捕获到的拦截的方法。比如: get set delete 等等。所以第二个参数我们创建一个baseHandle对象用来存放一些方法。


如果上述说的不是很全面,欢迎大神抡锤!

let baseHandle = {
// 那么,在获取值的时候,走的是这个get方法,那么就涉及到传参的一个问题
// target 指的是原对象数据,也就是你要操作的那个对象
// key 指的是,你所要获取的这个对象的属性
// receiver 指的是被代理后的 对象get(target,key,receiver){console.log('获取');// 理论上取值的话是这样的// return target[key];// 但是在vue3中 proxy 是和一个新的api结合使用的 reflect 反射let result = Reflect.get(target,key,receiver);return result;},set() {console.log('设置');let flag = Reflect.set(target,key,value,receiver); // 返回的是一个布尔类型,ture && false 告诉设置是否成功return flag;},deleteProperty() {console.log('删除');let res = Reflect.deleteProperty(target,key);return res;}
};
let observer = new Proxy(target,handle);return observer; // 改造后的响应式数据得返回出去

那么下面则是一部分 测试数据

let data = {name: 'wzy'};// proxy 为经过 reactive();函数处理过后的 代理对象
let proxy = reactive(data);
proxy.name = 'yolin'
console.log(proxy.name)
// 删除
delete proxy.name;
console.log(proxy)

本篇文章说的不是全部vue3.0的响应式原理,只是数据是一层的情况下的。咱们拆开来一步步了解,会很清晰。

但是看得懂不如自己手撸一遍来的实际。撸吧骚年!

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

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

相关文章

OceanBase首次阐述战略:继续坚持自研开放之路 开源300万行核心代码

简介&#xff1a; 在数据库OceanBase3.0峰会上&#xff0c;蚂蚁集团自主研发的分布式数据库OceanBase首次从技术、商业和生态三个维度对未来发展战略进行了系统性阐述。同时&#xff0c;OceanBase宣布正式开源&#xff0c;并成立OceanBase开源社区&#xff0c;社区官网同步上线…

amd核芯显卡控制面板自定义分辨率_主流显卡的一位猛将:蓝宝石Radeon RX 5500XT显卡首测...

一直以来主流级显卡总是处于一个较为尴尬的位置&#xff0c;原因是由于性能的限制&#xff0c;主流显卡经常位于不上不下的局面。上面和电竞级显卡有很大的性能差距&#xff0c;而往下又感受了日新月异的核显的压力。于是很多玩家宁可加钱购买电竞显卡也不愿意购买这些主流显卡…

阿里云研究员叔同:云原生是企业数字创新的最短路径

简介&#xff1a; 今天&#xff0c;数字化成为企业的核心竞争力&#xff0c;千行百业都在拥抱云计算&#xff0c;拥抱云原生。2020年我们认为是云原生的落地元年&#xff0c;那么2021年将是云原生加速推动企业数字创新的关键节点。 作者 | 叔同 来源 | 阿里技术公众号 今天&am…

计算 a+aa+aaa+aaaa+aaaaa+ 的和_海南A级景区,三亚市就有14个,你都去过吗

日前&#xff0c;海南省旅游资源规划开发质量评定委员会发布2020年第2号和2020年第3号公告&#xff0c;海南长影环球100奇幻乐园批准为国家4A级旅游景区&#xff0c;海南霸王岭国家森林公园和桂林洋国家热带农业公园批准为国家3A级旅游景区。具体公告如下&#xff1a;海南省旅游…

如何成为云原生时代的卓越架构师

简介&#xff1a; “软件开发需要面对本质困难和附属困难。云原生、DevOps大幅降低了附属困难&#xff0c;使得架构师可以全力聚焦于业务复杂性&#xff0c;而DDD恰是管理业务复杂性的有效方法。” 本文作者&#xff1a;张刚&#xff0c;阿里云云效资深技术专家&#xff0c;AL…

创业 4 年获近 7000 万美元融资,53 岁老程序员 all in 开源

作者 | 伍杏玲 今年 6 月&#xff0c;《人均估值 5000 万 RMB&#xff0c;53 岁程序员能做到的&#xff0c;你也能&#xff01;》一文刷爆技术人的朋友圈&#xff1a;2017 年成立的涛思数据&#xff0c;四年获近 7000 万美元融资&#xff0c;目前这个 40 人团队估值超 3 亿美元…

.net pdf转图片_PDF转图片怎么做?PDF一键转图片!

在日常工作中&#xff0c;我们经常需要把文件资料传给其他人看。但如果文档是PDF格式的话&#xff0c;很可能他人的设备因缺少相应的阅读工具而无法打开。这时&#xff0c;最好的方法就是将PDF文件转换成图片&#xff01;这样不管是在电脑还是在一些移动设备上都可以查看。接下…

为什么你应该关心领域模型?

简介&#xff1a; 领域模型是DDD的核心&#xff0c;更是业务的深入认知 作者简介&#xff1a;张刚&#xff0c;软件工程博士&#xff0c;阿里云云效资深技术专家&#xff0c;ALPD方法学核心成员。 引言 领域模型是重要的概念。但是&#xff0c;真正了解并能熟练运用它的人并不…

三包围结构的字是什么样的_一年级语文重点(字、字母、字词、词语、句子)知识点汇总!...

一年级语文重点汇总一、字母A B C D E F G H I J K L M N O P Q R S T U V W X Y Za b c d e f g h i j k l m n o p q r s t u v w x y z二、 字1、组词。(形近字和同音字)么(什么) 无(无法) 高(高兴)公(公共) 元(一元…

Java编程技巧之样板代码

简介&#xff1a; 在日常编码的过程中&#xff0c;可以总结出很多“样板代码”&#xff0c;就像”活字印刷术中的“活字”一样。当我们编写新的代码时&#xff0c;需要用到这些“活字”&#xff0c;就把“样板代码”拷贝过来&#xff0c;修改替换一下就可以了&#xff0c;写起代…

CPU 被挖矿,Redis 竟是内鬼!

作者 | 轩辕之风O来源 | 编程技术宇宙却说这一日&#xff0c;Redis正如往常一般工作&#xff0c;不久便收到了一条SAVE命令。虽说这Redis常被用来当做缓存&#xff0c;数据只存在于内存中&#xff0c;却也能通过SAVE命令将内存中的数据保存到磁盘文件中以便持久化存储。只见Red…

vos3000落地网关对接教学_跨国合作:Serverless Components 在腾讯云的落地和实践

导语 | Serverless Components 是 Serverless Framework 推出的最新解决⽅案&#xff0c;具有基础设施编排能⼒&#xff0c;开发者通过使⽤ Serverless Components&#xff0c;可以灵活构建、组合和部署 Serverless 应⽤。本文是对腾讯云云函数团队前端负责人蔡卫峰在云社区沙龙…

Hologres揭秘:深度解析高效率分布式查询引擎

简介&#xff1a; 从阿里集团诞生到云上商业化&#xff0c;随着业务的发展和技术的演进&#xff0c;Hologres也在持续不断优化核心技术竞争力&#xff0c;为了让大家更加了解Hologres&#xff0c;我们计划持续推出Hologers底层技术原理揭秘系列&#xff0c;从高性能存储引擎到高…

电脑两边黑边怎么还原_Mac电脑录制的视频有黑边?如何解决

Mac电脑录制屏幕视频时两边有黑边&#xff0c;无论是将录制格式设置为1080p还是默认分辨率&#xff0c;最终生成的视频两边都有黑边&#xff0c;遇到这种情况如何解决呢&#xff1f;原因是 mac 录制出的视频分辨率比例是 16:10 &#xff0c;比需要的 16:9 高一点。接下来给大家…

程序员有必要参加软考吗?大一可以考的编程证书还有哪些

软考的全称是&#xff1a;计算机技术与软件专业技术资格水平考试。通过考试获得证书的人员&#xff0c;表明其已具备相应等级的水平和能力&#xff0c;用人单位可根据工作需要从获得证书的人员中择优聘任相应专业技术职务。个人认为&#xff0c;程序员有没有必要参与软考最主要…

【知识连载】 如何用钉钉宜搭制定企业疫情防控数字化管理方案

简介&#xff1a; 【零起点入门系列教程】将会带给大家从业务视角出发由浅入深地学习用宜搭实现应用搭建。即便是没有任何代码基础的新手只要跟着系列课程&#xff0c;从0开始慢慢修炼&#xff0c;也能找到成功搭建应用的乐趣。今天第六讲&#xff0c;示例如何用钉钉宜搭搭建企…

mapreduce原理_Hbase Bulkload 原理面试必备

当需要大批量的向Hbase导入数据时&#xff0c;我们可以使用Hbase Bulkload的方式&#xff0c;这种方式是先生成Hbase的底层存储文件 HFile&#xff0c;然后直接将这些 HFile 移动到Hbase的存储目录下。它相比调用Hbase 的 put 接口添加数据&#xff0c;处理效率更快并且对Hbase…

StarLake:汇量科技云原生数据湖的探索和实践

简介&#xff1a; 快速了解汇量科技在云原生数据湖领域的探索和实践&#xff0c;详解 StarLake 的架构及业务应用案例。 作者&#xff1a;陈绪&#xff08;汇量科技资深算法架构师&#xff0c;EnginePlus 2.0 产品负责人&#xff09; 内容框架&#xff1a; 互联网业务视角看湖…

sql语句在navicat中可以查询到所有数据但是在idea程序中不行_数据迁移测试实施方案...

点击关注&#xff0c;我们共同每天进步一点点&#xff01;最近经历了一场大型的数据迁移测试&#xff0c;因为以前对数据迁移测试研究甚少&#xff0c;所以对测试实施方案的制定非常的棘手&#xff0c;在网上也查询了很多&#xff0c;发现相关资料很少&#xff0c;并且大部分都…

报告:69% 的企业表示云技术有助于他们的疫情恢复

根据 DigitalOcean 最近的报告&#xff0c;在疫情高峰期间云使用增加的企业中&#xff0c;86%的企业表示云使用量在 2021 年继续增加&#xff0c;这表明数字加速和云采用没有放缓迹象。随着 2022 年的临近&#xff0c;对于各种规模的企业来说&#xff0c;这场疫情仍是头等大事&…