当前位置: 首页 > 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;

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

http://www.lryc.cn/news/290461.html

相关文章:

  • 3、css设置样式总结、节点、节点之间关系、创建元素的方式、BOM
  • 计算机网络-物理层传输介质(导向传输介质-双绞线 同轴电缆 光纤和非导向性传输介质-无线波 微波 红外线 激光)
  • springboot3+vue3支付宝在线支付案例-渲染产品列表页面
  • 数字美妆技术:美颜SDK和动态贴纸技术的崭新时代
  • 使用OpenCV实现一个简单的实时人脸跟踪
  • 关于监控的那些事,你有必要了解一下
  • C#学习笔记_数组
  • 微信小程序canvas画布实现文字自由缩放、移动功能
  • jQuery 获取并设置 CSS 类 —— W3school 详解 简单易懂(十五)
  • dart使用教程
  • CSS3:最新特性和实例教程
  • leetcode—跳跃游戏—贪心算法
  • Databend 开源周报第 130 期
  • 【web安全】文件上传漏洞
  • C++笔记之RTTI、RAII、MVC、MVVM、SOLID在C++中的表现
  • 出口额行业第二再创新高!苏州金龙的2023全球畅行之路
  • Python入门到精通(六)——Python函数进阶
  • docker: missing signature key
  • 选型 之 工业相机篇
  • 深入解析美颜SDK和动态贴纸技术的工作原理与应用
  • java代码中调用自定义函数
  • 备战蓝桥杯---数据结构与STL应用(基础实战篇1)
  • 项目解决方案:非执法视频监控系统项目设计方案
  • 网络安全01--负载均衡
  • Mamba系列日积月累(一):状态空间模型SSM的离散化过程推导
  • React中使用LazyBuilder实现页面懒加载方法二
  • 安全测试:史上最全的攻防渗透信息收集方法、工具!
  • minio2023版本安装对象存储文件迁移
  • ###C语言程序设计-----C语言学习(7)#(调试篇)
  • 腾讯云Linux(OpenCloudOS)安装tomcat9(9.0.85)