当前位置: 首页 > news >正文

【Vue】为什么Vue3使用Proxy代替defineProperty?

先来看看 Vue2 中 defineProperty 来操作数据:

const obj = {a: 1,b: 2,c: {a: 1,b: 2}
}
function _isObject(v) {return typeof v === 'object' && v !== null;
}
function observe(object) {for (let key in object) {let v = object[key];if (_isObject(v)) {observe(v)}Object.defineProperty(object, key, {get() {console.log('read ' + key);return v;},set(val) {if (val !== v) {console.log('change ' + key);v = val;}}})}
}
observe(obj)
// obj.a = 3;
obj.c.a = 4;

所以 Vue2 的缺陷是无法监听到属性的增加和删除,因为只有 getter 和 setter 函数。此外,还通过深度遍历,有效率的损失,将属性变成 getter 和 setter 函数。

而 Vue3 中Proxy 直接监听整个对象的变化:

const obj = {a: 1,b: 2,c: {a: 1,b: 2}
}
function _isObject(v) {return typeof v === 'object' && v !== null;
}
function observe(obj) {const proxy = new Proxy(obj, {get(target, k) {let v = target[k]if (_isObject(v)) {v = observe(v);}console.log('read', k)return v;},set(target, k, val) {if (target[k] !== val) {target[k] = val;console.log('change', k)}}// ....})return proxy;
}proxy.a = 3;
proxy.aa;

不监听属性,而是监听整个代理对象。只有当读取到对象属性的时候才会进行遍历监听。

相关文章:

  • Log4j2的PatternLayout详解
  • 如何使用Python+Flask搭建本地Web站点并结合内网穿透公网访问?
  • TypeScript实战系列之强力爆破泛型的困扰
  • vuex store,mutations,getters,actions
  • C++ 多线程编程中的条件变量std::condition_variable
  • 西瓜书学习笔记——层次聚类(公式推导+举例应用)
  • 在Ubuntu中修改系统时间并使其在掉电时保存
  • linux bash shell的getopt以及函数用法小记
  • 使用nginx对视频、音频、图片等静态资源网址,加token签权
  • python笔记10
  • 腾讯云Linux(OpenCloudOS)安装tomcat9(9.0.85)
  • Vite+Vue3使用Vue-i18n笔记
  • sql 行转列 日周月 图表统计
  • redis-4 集群
  • 前端JavaScript篇之object.assign和扩展运算法是深拷贝还是浅拷贝,两者区别、如何判断一个对象是空对象
  • 【mysql】环境安装、服务启动、密码设置
  • 77. Combinations
  • css的样式优先级
  • Git 使用集
  • golang 发送GET和POST示例
  • gops —— Go 程序诊断分析工具
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • rabbitmq延迟消息示例
  • React-flux杂记
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Web Storage相关
  • 笨办法学C 练习34:动态数组
  • 测试开发系类之接口自动化测试
  • 构造函数(constructor)与原型链(prototype)关系
  • 如何用vue打造一个移动端音乐播放器
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 我的业余项目总结
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 新版博客前端前瞻
  • 一、python与pycharm的安装
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 数据可视化之下发图实践
  • 整理一些计算机基础知识!
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • ()、[]、{}、(())、[[]]命令替换
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • ******之网络***——物理***
  • ./configure,make,make install的作用(转)
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net CoreRabbitMQ消息存储可靠机制
  • .net通用权限框架B/S (三)--MODEL层(2)