【VUE】1.vue2与vue3响应式原理

4 篇文章 0 订阅
订阅专栏
Vue2.x使用Object.defineProperty进行数据劫持,对对象属性的读取和修改进行拦截,但存在新增和删除属性不响应的问题。Vue3.x引入Proxy和Reflect,能更全面地拦截对象中任意属性的变化,包括读写、添加和删除,提供更完善的响应式机制。
摘要由CSDN通过智能技术生成

vue2.x的响应式

Vue 2.x 的响应式系统是其核心特性之一,它允许 Vue 应用程序中的数据变化时,视图能够自动更新。这一特性主要通过 Object.defineProperty() 方法实现(对于对象)和通过重写数组方法(对于数组)来实现

对象类型的响应式实现

Vue 使用 Object.defineProperty() 将每个属性转换成 getter/setter。当访问或修改这些属性时,getter/setter 会被调用,从而允许 Vue 拦截属性的访问和修改(数据劫持),并在必要时更新视图。

优点

  • 精确控制属性访问和修改。
  • 易于理解和实现。

缺点

  • 不能监听属性的新增或删除,界面不会更新。

如果需要为对象添加新属性,并希望它是响应式的,需要使用 Vue 提供的 Vue.set(object, propertyName, value) 方法或 this.$set(object, propertyName, value) 实例方法。

对于删除属性,可以使用 Vue.delete(object, propertyName) 或 this.$delete(object, propertyName) 来确保删除操作也能触发视图更新。

  • 递归遍历对象属性可能导致性能问题(尽管 Vue 提供了选项来限制深度)。

数组类型的响应式实现

Vue 不能使用 Object.defineProperty() 拦截索引的访问,因为数组索引是特殊的对象键(数字),且数组的 length 属性也是一个特殊属性。Vue 重写了数组方法(如 pushpopshiftunshiftsplicesortreverse),以在这些方法被调用时触发视图更新。

优点

  • 允许数组操作自动触发视图更新。

缺点

  • 通过索引直接修改数组项时( vm.items[index] = newValue),不能触发视图更新。Vue 不能检测到这种变化。使用 Vue 的响应式数组方法来触发更新,如 vm.items.splice(index, 1, newValue)
  • 需要手动添加新的数组方法到 Vue 的响应式系统中,如果使用了未被重写的方法(如 filterconcat 和 slice),它们返回的数组将不是响应式的。

// 数据劫持
Object.defineProperty(data,'count'{
    get () {}, 
    set () {}
})

 vue3.x的响应式

Vue 3.x 的响应式系统相较于 Vue 2.x 有了显著的改进,主要引入了 Proxy 和 Reflect 来实现更加全面和高效的响应式能力。

Proxy(代理)

Proxy:Proxy - JavaScript | MDN

Vue 3.x 使用 Proxy 来代替 Vue 2.x 中的 Object.defineProperty()Proxy 可在目标对象前架设一层“拦截”,外界对该对象的访问都必须先通过这层拦截,因此提供了一种对对象访问进行细粒度控制的能力。 

  • 属性值的读写:通过拦截 get 和 set 操作符,Vue 可以追踪到对象属性的读取和修改,从而触发依赖更新。
  • 属性的添加和删除Proxy 可拦截到对象的 definePropertydeleteProperty 和 ownKeys 等操作,因此 Vue 能够检测到新属性的添加和现有属性的删除,并相应地更新依赖。

Reflect(反射)

Reflect: Reflect - JavaScript | MDN

在 Vue 3.x 的响应式系统中,Reflect 被用来提供默认行为,对源对象属性进行操作。Reflect 是一个内置对象,提供了一套用于操作对象的方法,这些方法与 Object 的方法相同,但 Reflect 的方法总是返回结果,而 Object 的方法可能会抛出异常(如 Object.defineProperty() 在属性不可配置时)。

  • 使用 Reflect 可以让 Proxy 的处理逻辑更加清晰和一致。例如,在 Proxy 的 set 陷阱中,你可以使用 Reflect.set() 来执行实际的属性设置操作,这样即使遇到异常情况,处理逻辑也会更加统一。

Vue 3.x 响应式系统的优点

  1. 更全面的响应式:能够拦截对象属性的添加、删除和修改,以及数组索引的修改,解决了 Vue 2.x 中的一些限制。
  2. 更好的性能:由于 Proxy 可以拦截更多类型的操作,Vue 3.x 的响应式系统在某些情况下可以更加高效地处理数据变化。
  3. 更简洁的代码:使用 Proxy 和 Reflect 可以让响应式系统的实现更加简洁和直观。

注意事项

  • Proxy 和 Reflect 是 ES6 引入的新特性,因此在一些旧版浏览器中可能不可用。Vue 3.x 需要在一个支持这些特性的环境中运行。
  • 虽然 Proxy 提供了强大的拦截能力,但也需要谨慎使用,以避免不必要的性能开销。在 Vue 3.x 中,Vue 团队已经对响应式系统的性能进行了优化,以确保其在实际应用中的高效性。
// 模拟Vue3中实现响应式
const p = new Proxy(obj, {
    // 拦截读取属性值:读取obj的某个属性时调用 
    get(target,propName){
		console.log(`读取了obj身上的${propName}属性`) 
		return Reflect.get(target,propName)
	},
    // 拦截设置属性值或添加新属性:修改obj的某个属性、或给obj追加某个属性时调用 
    set(target,propName,value){
    	console.log(`修改了obj身上的${propName}属性,我要去更新界面了!`) 
    	Reflect.set(target,propName,value)
	},
    // 拦截删除属性:删除obj的某个属性时调用
    deleteProperty(target,propName){
    	console.log(`删除了obj身上的${propName}属性,我要去更新界面了!)`
		return Reflect.deleteProperty(target,propName)
	}
})

Vue3通透教程【五】Vue3中的响应式数据 reactive函数、ref函数
官方推荐
02-23 4万+
Vue3中的响应式数据
前端工程化:基于Vue.js 3.0的设计与实践
最新发布
weixin_44976692的博客
06-08 4万+
本书由程沛权倾力撰写,基于其多年的前端开发和一线团队管理经验,将Vue 3的知识点按照工程师做项目的实施顺序梳理成章。从前端工程化的基础开始,到TypeScript的深入学习,再到使用TypeScript开发Vue 3项目,通过循序渐进的学习过程,帮助读者在前端工程化领域不断提升实战能力。程沛权,养了三只猫的程序员,热爱烹饪、设计和音乐。在前端领域有多年的开发经验和一线开发团队管理经验。
稍微学一下Vue的数据响应式Vue2及Vue3区别)
10-15
主要介绍了稍微学一下 Vue 的数据响应式Vue2 及 Vue3),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
vue2与vue3的响应式原理
韩旭不会敲代码吧的博客
12-07 3655
vue2 1、对象类型 原理:通过Object.defineProperty()对属性的读取、修改进行拦截(数据劫持)。 1、定义数据: const vm = new Vue({ el: '#root', data: { person:{ name: '张三', age: 18 } } }) 2、加工数据:为了实现响应式vue会给data中的每一组key:value都形成了get和set的写法 只要data中的属性发生改变,就会调用set方法,然后重新解析模板,生成虚拟DOM,新旧虚拟DOM
vue2与vue3响应式原理介绍
m0_70730767的博客
04-12 1198
vue2与vue3响应式原理的区别
vue2和vue3实现响应式原理
weixin_50535267的博客
06-10 381
vue2和vue3处理响应式数据的原理及不同之处
Vue2和Vue3之响应式原理详解
上善若泪
03-26 877
在讲解之前,我们先了解一下数据响应式是什么?所谓数据响应式就是建立响应式数据与依赖(调用了响应式数据的操作)之间的关系,当响应式数据发生变化时,可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作,可以是DOM更新,也可以是执行一些回调函数。Vue3track(收集依赖)和trigger(触发依赖)
三、【Vue3】——Vue2与Vue3响应式原理区别
yifei1234567的博客
03-30 4956
Vue2实现响应式原理使用的是Object.defineProperty()对对象中某个属性的读取、修改进行拦截,存在新增和删除缺陷。而Vue3实现响应式原理使用的是Proxy代理,拦截对象中任意属性的变化;
Vue.js---响应式原理
weixin_52462962的博客
03-22 4086
挑战每天更一篇--Day3
深入了解Vue 2响应式原理,并手写一个简单的Vue
Niall_Tonshall的博客
04-13 2508
1. Vue 2的响应式原理 Vue.js 一个核心思想是数据驱动。所谓数据驱动是指视图是由数据驱动生成的,对视图的修改,不会直接操作 DOM,而是通过修改数据。vue.js里面只需要改变数据,Vue.js通过Directives指令去对DOM做封装,当数据发生变化,会通知指令去修改对应的DOM,数据驱动DOM的变化,DOM是数据的一种自然的映射。vue.js还会对View操作做一些监听(DOM Listener),当我们修改视图的时候,vue.js监听到这些变化,从而改变数据。这样就形成了数据的双向绑定。
Vue2和Vue3响应式原理【全】
m0_60676278的博客
04-14 3382
响应式原理就是指的是MVVM的设计模式的核心,即数据驱动页面,一旦数据改- 变,视图也会跟着改动。vue2的响应式原理是由Object.defineProperty()实现的 (数据劫持)vue3的响应式原理是由es6中的Proxy所实现的 (数据代理)直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。(应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型的实例上调用。
JS高级——vue2和vue3响应式原理
@SCY
05-15 249
介绍vue2、vue3中监听对象的方式以及响应原理
vue2和vue3的数据响应式原理总结
weixin_45532305的博客
11-08 571
vue2官方的介绍 当你把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的 property,并使用 Object.defineProperty 把这些 property 全部转为 getter/setter。Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是 Vue 不支持 IE8 以及更低版本浏览器的原因。 ` 这些 getter/setter 对用户来说是不可见的,但是在内部它们让 Vue 能够追踪依
vue2-响应式-简说
曾忆城只想写bug
01-13 424
vue2-响应式-简说前言1、响应式核心 -- Object.defineProperty2、Demo -- 我的垃圾响应式代码Html部分JavaScript部分 前言 本文旨在让小白大概了解一下怎么实现响应式(即:双向绑定 v-model),像源码中核心部分的观察者模式,模板渲染注册观察者等操作统统略过,大佬看到这就可以忽略此文了。 文章分两部分来讲,基础补充(Object.defineProperty)和代码的简单实现。 1、响应式核心 – Object.defineProperty 可能很多小白不知
vue2.x数据响应式的实现
Aaron Con的博客
04-21 1780
总结vue2中数据响应式的实现,以及简单指令的封装
vue2框架简易版响应式设计(观察者模式)
coding...
12-03 754
添加数据劫持方法// Vue.js//Observer专门用于数据劫持data;get() {console.log(`使用了${key}这个属性`);},set(val) {console.log(`修改了${key}属性`, val);})walk() {})age:11对于data来说,我们自己数据劫持存了一份在$data,并且还将$data中每个数据都再次存在了vue实例上,创建Vue类。//$data上的所有数据都要数据劫持//$data存放所有的数据。
vue2的响应式原理
VegetableKCCCC的博客
09-29 646
Vue响应式原理是用Object.definePrototy()的et与get结合观察者模式进行数据劫持; 首先了解一下Object.definePrototy()的set与get; 在获取对象prototy的时候,会自动调用get方法,在修改时会自动调用set方法 VUE给data里所有的属性加上set,get这个过程就叫做Reactive化。 观察者模式(发布订阅者模式) 观察者模式分为注册环节与发布环节 依赖dep类与watch类 这个Watcher实际上是连接Vue组件与Dep的桥梁。
VUE2数据响应式原理
seapackk的博客
07-22 582
vue2的官方文档上可以看到它对响应式原理的解释是:数据劫持:通过Object.defineProperty方法实现vue中data选项数据的监听订阅-发布者模式:通过Watcher和Dep采用观察者模式实现依赖收集和派发更新的过程Object.defineProperty() 静态方法会直接在一个对象上定义一个新属性,或修改其现有属性,并返回此对象。vue如何实现数据的响应式的?通过Object.defineProperty方法实现对数据的响应式。对于对象,它会循环遍历对象的所有属性。
写文章

热门文章

  • 技术选型(Vue3 + TS)方案 2719
  • 发布一个eslint的npm包 2232
  • electron:1.video 标签加载大视频时,可能会遇到内存限制的问题而只显示音频 1455
  • 【CSS】3.CSS写一个箭头 1225
  • 【软件设计师】——2.数据结构与算法 1165

分类专栏

  • 前端面试 21篇
  • Vue 4篇
  • 前端开发 6篇
  • 前端demo 10篇
  • 备考软件设计师 13篇
  • 备考系统集成项目管理工程师 8篇
  • electron 2篇
  • 前端工具 3篇
  • 前端方案 4篇
  • CSS 4篇

最新评论

  • 【前端面试】五、框架

    程序员小羊!: 常不错的技术领域文章分享,解决了我在实践中的大问题!博主很有耐心,更有对知识的热忱和热爱,写了这么实用有效的分享,值得收藏点赞,我也写了相关领域一些文章,大佬可以指导下,大家可以互相关注,共同学习。

  • 基于sass的前端样式管理方案

    CSDN-Ada助手: Vue入门 技能树或许可以帮到你:https://edu.csdn.net/skill/vue?utm_source=AI_act_vue

大家在看

  • 网络安全(黑客技术)2024年三个月自学手册
  • 大模型微调的一些技术理解(一) 864
  • HTML+CSS简单的网页制作期末作业——浙江旅游景点介绍网页制作
  • 奥普思凯 AI 扫描仪 —— 高效办公的新利器
  • 专利代理人考试备考利器——提升检索能力的专利检索平台 318

最新文章

  • 【前端面试】五、框架
  • 【前端面试】八、工程化
  • 【前端面试】七、算法-递归、拷贝等
2024年24篇
2023年30篇
2022年22篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳坪山网站建设公司响应式网站有利于优化吗中山校园网站优化效果五金网站优化多少钱北仑区网站优化费用可以优化的免费网站优化师数据洞察网站钢城网站优化找哪家安平县网站优化培训济南家居行业网站优化推广可靠吗襄阳品牌网站优化多少钱贵州网站长尾关键词优化网站快速优化排名地址专业网站优化价格网站seo优化排名服务网站排名优化厂商定制网站结构优化包括网站建设优化帮你火21星邯郸网站建设优化关键词排名优化网站建设公司聊城站群网站优化怎样做好网站优化方法海盐网站优化推广优化网站方法匀云速捷声名搜索引擎对网站优化有什么帮助民间工艺品网站优化滨州优化网站单价大连网站优化如何汕头网站优化推广厂家网站优化以及服务的工作任务网站优化春哥香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

深圳坪山网站建设公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化