vue响应式原理——vue2和vue3的响应式实现区别

        Vue的核心功能点之一是响应式:Vue 会自动跟踪 JavaScript 状态并在其发生变化时响应式地更新 DOM。

        简单的来说就是,页面的渲染效果会随着数据变化而变化,不用我们去手动操作DOM树进行数据变化后的渲染。为了实现这一目的,我们最简单的实现思路就是去监听每一个对象中的值,在我们获取或者更新这个值是插上一脚来操作DOM,此时,就可以通过函数去操作这个对象,以达到我们的目的。

vue2的响应式实现方法:defineProperty

        Object.defineProperty() 是 JavaScript 中的一个方法,用于直接在一个对象上定义一个新属性,或者修改一个已经存在的属性。它提供了精细的控制能力,可以定义属性的特性(特性包括可枚举、可配置、可写性等),并可以定义 getter 和 setter,在属性被访问或者设置时执行自定义的行为。

        这里vue2的思路则为通过该方法来遍历对象,达到监听对象属性的目的,代码如下:

const obj = {a: 1,b: 2,c: {d: 3,e: 4,}
} as any//观察
const observer = (obj: any) => {for (const key in obj) {let temp = obj[key]if (typeof obj[key] === 'object') {observer(obj[key])} else {Object.defineProperty(obj, key, {get() {console.log('读取', key)return temp},set(val) {console.log('修改', key)temp = val}})}}
}observer(obj)obj.a;// 读取 a
obj.b = 3; // 修改 b
obj.c.d; // 读取 c.dobj.f = 5 // 新添属性 f 并修改 f

输出结果:

 

        这里我们可以发现, 我们用递归的方式来去对每个值进行了监听,但是对应后面新增的对象属性就没有相对性的监听效果,如果想进行监听,就需要对这个属性进行单独的处理:

const obj = {a: 1,b: 2,c: {d: 3,e: 4,}
} as any//观察
const observer = (obj: any) => {for (const key in obj) {let temp = obj[key]if (typeof obj[key] === 'object') {observer(obj[key])} else {Object.defineProperty(obj, key, {get() {console.log('读取', key)return temp},set(val) {console.log('修改', key)temp = val}})}}
}const set = (obj: any, key: string, value: any) => {obj[key] = valuelet temp = obj[key]if (typeof value === 'object') {observer(value)} else {Object.defineProperty(obj, key, {get() {console.log('读取', key)return temp},set(val) {console.log('修改', key)temp = val}})}
}observer(obj)obj.a;// 读取 a
obj.b = 3; // 修改 b
obj.c.d; // 读取 c.dset(obj, 'f', {g: 5
}) // 修改 fobj.f.g; // 读取 f

输出结果:

 vue3的响应式实现方法:Proxy

        Proxy 是 ES6 中新增的一个功能,它允许你在访问一个对象之前定义自定义行为。通过 Proxy,你可以创建一个代理对象来包裹目标对象,并可以拦截并重定义该对象的各种操作,如属性的读取、赋值、删除等操作,甚至可以自定义对象的行为。

       vue3使用的是Proxy来进行响应式操作的,这里就没必要将对象的所有属性进行遍历,而是使用哪个属性,则对哪个属性进行监听:

const obj ={a: 1,b: 2,c: {d: 3,e: 4,}
} as anyconst option = {get(target: any, key: any) {console.log('读取', key)//判断是否是对象if (typeof target[key] === 'object') {return new Proxy(target[key], option)}return target[key]},set(target: any, key: any, value: any) {console.log('设置', key, value)//判断是否是对象if (typeof value === 'object') {target[key] = new Proxy(value, option)return true}return true},
}const proxy = new Proxy(obj, option)proxy.a = 10; // 设置 a 10
proxy.a; // 读取 aproxy.c.f = 20; // 设置 c.f 20
proxy.c.f; // 读取 c.fproxy.c; // 读取 c

输出结果:

总结

        vue2和vue3的响应式操作相比,vue2需要遍历对象,且对于新的属性无法直接进行监听,而vue3使用代理对象就不会出现这个问题。

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

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

相关文章

Kaamel白皮书:2025版COPPA落地实操指南

COPPA简介 《儿童在线隐私保护法案》(COPPA)于1998年在美国颁布,其最初的动因源于人们日益增长的对互联网上收集儿童个人信息的担忧。为了响应这一问题,联邦贸易委员会(FTC)被授权制定并执行相关法规。COP…

测试基础笔记第十四天

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、字符串1.字符串2.字符串切片3.查找find()4.去除两端空白字符 strip5.字符串转换大小写 lower、upper5.拆分 split()6.字符串的其他常见方…

什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?

大家好,我是锋哥。今天分享关于【什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程?】面试题。希望对大家有帮助; 什么是Lua模块?你会如何使用NGINX的Lua模块来定制请求处理流程? 1000道 互联…

ubuntu扩展逻辑卷并调整文件系统大小步骤

安装好ubuntu如果没有调整磁盘空间,一般默认给你100G的空间,在用完时再调整也还来得及,下面是 ubuntu扩展逻辑卷并调整文件系统大小步骤: 1. 扩展逻辑卷 运行以下命令来扩展逻辑卷 /dev/ubuntu-vg/ubuntu-lv,使其使用卷组中所有未分配的空间&#xff…

复杂背景下无人机影像小目标检测:MPE-YOLO抗遮挡与抗背景干扰设计

目录 一、引言 二、挑战和贡献 密集小目标和遮挡 实时性要求与精度权衡 复杂背景 三、MPE-YOLO模型细节 多级特征集成器(MFI) 感知增强卷积(PEC) 增强范围C2f模块(ES-C2f) 四、Coovally AI模型训…

【C++】13.list的模拟实现

首先,我们需要把链表管理起来,也就是把一个个节点管理起来,但是每个节点的信息我们也需要管理,例如节点的前驱指针和后驱指针,以及节点的值,所以我们这里先封装两个类来管理节点和链表。 namespace Ro {te…

TinyVue v3.22.0 正式发布:深色模式上线!集成 UnoCSS 图标库!TypeScript 类型支持全面升级!

我们非常高兴地宣布,2025年4月7日,TinyVue发布了v3.22.0🎉。 本次 3.22.0 版本主要有以下重大变更: 支持深色模式增加基于 UnoCSS 的图标库更丰富的 TypeScript 类型声明支持 XSS 配置 详细的 Release Notes 请参考&#xff1a…

超级创新思路:基于CBAM-Transformer的强化学习时间序列预测模型(Python\matlab实现)

首先声明,该模型为原创!原创!原创!且该思路还未有成果发表,感兴趣的小伙伴可以借鉴!需要完整代码可私信或评论! 本方案可用于医疗、金融、交通、零售、光伏功率预测、估计预测、天气预测、流量预测、故障检测等领域! 目录 首先声明,该模型为原创!原创!原创!且该思…

Apache Sqoop数据采集问题

Sqoop数据采集格式问题 一、Sqoop工作原理二、Sqoop命令格式三、Oracle数据采集格式问题四、Sqoop增量采集方案 Apache Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql、postgresql…)间进行数据的传递,可以将一个关系型数据库&…

Grok发布了Grok Studio 和 Workspaces两个强大的功能。该如何使用?如何使用Grok3 API?

最近Grok又更新了几个功能:Grok Studio 和 Workspaces。 其中 Grok Studio 主要功能包括: 代码执行:在预览标签中运行 HTML 片段、Python、JavaScript 等。 Google Drive 集成:附加并处理 Docs、Sheets、Slides等文件。 协作工…

Vue选项式 API 与组合式 API

选项式 API 与组合式 API 选项式 API 选项式 API 是 Vue 2 中常用的开发方式&#xff0c;在 Vue 3 里依旧得到支持。它把组件逻辑划分为不同的选项&#xff0c;像 data、methods、computed 等。 <template><div><p>Count: {{ count }}</p><button…

SiamMask中的分类分支、回归分支与Mask分支,有何本质差异?

SiamMask中的分类分支、回归分支与Mask分支&#xff0c;有何本质差异&#xff1f; 一、引言二、分支定位与任务目标三、网络结构与感受野设计3.1 分类分支&#xff08;Classification Head&#xff09;3.2 回归分支&#xff08;Regression Head&#xff09;3.3 Mask分支&#x…

threejs学习day02

场景、相机、渲染器 一、创建3D场景 // 引入threejs import * as THREE from three// 创建一个三维场景scene const scene new THREE.Scene();// 给三维场景添加物品 const geometry new THREE.BoxGeometry(100,100,100) // 形状 const meterial new THREE.MeshBasicMat…

K8S Pod 常见数据存储方案

假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、理论介绍 1.1、Volumes 卷 Kubernetes 的卷是 pod 的⼀个组成部分&#xff0c;因此像容器⼀样在 pod 的规范&#xff08;pod.spec&#x…

【MySQL数据库】函数操作

目录 1&#xff0c;日期函数 2&#xff0c;字符串函数 3&#xff0c;数学函数 1&#xff0c;日期函数 样例&#xff1a; 获得年月日 select current_date(); 获取时分秒 select current_time(); 获得时间戳 select current_timestamp(); 在日期的基础上加日期 在2025年4月27…

【每日随笔】文化属性 ① ( 天机 | 强势文化与弱势文化 | 文化属性的形成与改变 | 强势文化 具备的特点 )

文章目录 一、文化属性1、天机2、文化属性的强势文化与弱势文化强势文化弱势文化 二、文化属性的形成与改变1、文化属性形成2、文化属性改变3、文化知识的阶层 三、强势文化 具备的 特点 一、文化属性 1、天机 如果想要 了解这个世界的 底层架构 , 就需要掌握 洞察事物本质 的能…

【Fifty Project - D18】

感觉自己就不是计划星球人&#xff0c;虽然fifty project要求每天早上完成一天的计划&#xff0c;但是对于一个p人脑子&#xff0c;强制自己按照计划行事真的太难了。我也理解在早晨花费时间做好一天的计划有很多好处&#xff0c;但是实际行动起来完成率极低。p人的世界里变动太…

Linux系统编程 day11 锁 (两天没有更新了,中期完就休息了)

锁的注意事项 1、尽量保证锁的粒度&#xff0c;越小越好。(访问共享数据前&#xff0c;加锁&#xff0c;访问结束后立即解锁) 2、互斥锁&#xff0c;本质是结构体&#xff0c;但是可以看成整数&#xff0c;初值为1。(pthread_mutex_init调用成功) 3、加锁&#xff1a; --操作…

【Maven】特殊pom.xml配置文件 - BOM

文章目录 特殊pom.xml配置文件 - BOM一、例子二、注意事项1.特殊的子pom.xml文件2.dependencyManagement 特殊pom.xml配置文件 - BOM 仅用于集中管理项目依赖版本 在 Maven 中&#xff0c;BOM 用于定义一个项目的依赖版本的集合&#xff0c;通常用于管理一组共享的依赖版本。这…

《代码整洁之道》第5章 格式 - 笔记

你应该选择一套管理代码格式的简单规则。如果是团队&#xff0c;应该选择一套团队一致同意采用的简单格式规则。 最重要的原则&#xff1a;一致性&#xff08;Consistency&#xff09;&#xff01; 没有完美的格式规范&#xff0c;但有统一的规范。 整个团队&#xff08;或者…