Vue3.0中的响应式原理

这篇具有很好参考价值的文章主要介绍了Vue3.0中的响应式原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回顾Vue2的响应式原理

实现原理:

- 对象类型:通过 ``Object.defineProperty()``对属性的读取、修改进行拦截(数据劫持)。
- 数组类型:通过重写更新数组的一系列方法来实现拦截。(对数组的变更方法进行了包裹)。

Object.defineProperty(data, 'count', {
    get () {}, 
    set () {}
})

存在问题:

- 新增属性、删除属性, 界面不会更新。
- 直接通过下标修改数组, 界面不会自动更新。

Vue3.0中的响应式原理Vue3.0中的响应式原理

Vue3.0中的响应式原理 添加之前是undefined,添加之后页面是有数据的,但是页面并没有展示,因为直接这样操作数据,通过defineProperty它是检测不到的

Vue3.0中的响应式原理当然在v2中也是能修改的,需要使用$set这个api 

 Vue3.0中的响应式原理

Vue3.0中的响应式原理 删除这个数据,我们发现跟上面一样,页面上没有变化,但是数据发生改变

Vue3.0中的响应式原理 也就是我也需要通过api的方式

Vue3.0中的响应式原理 数组也存在上述的问题 

Vue3的响应式原理--Proxy

Vue3.0中的响应式原理而v3中不存在v2的问题 

这是为什么呢?这就要说到v3的响应式原理了

首先模拟Vue2中实现响应式

let p = {}
			Object.defineProperty(p,'name',{
				configurable:true,
				get(){ //有人读取name时调用
					return person.name
				},
				set(value){ //有人修改name时调用
					console.log('有人修改了name属性,我发现了,我要去更新界面!')
					person.name = value
				}
			})
			Object.defineProperty(p,'age',{
				get(){ //有人读取age时调用
					return person.age
				},
				set(value){ //有人修改age时调用
					console.log('有人修改了age属性,我发现了,我要去更新界面!')
					person.age = value
				}
			})

这个确实能实现响应式数据,但是有弊端,对于新添加的或删除的数据没有办法捕获

模拟Vue3中实现响应式

想要写v3中的响应式,首先我们要知道window上面的Proxy 

 Proxy - JavaScript | MDN (mozilla.org)

Vue3.0中的响应式原理 注意的一点,这个代理对象,的第二个参数不能不写。宁愿给它空对象

Vue3.0中的响应式原理 Vue3.0中的响应式原理

Vue3.0中的响应式原理 最重要的是你对他进行增删改查的操作,他都能捕获到。

如果我们想要操作数据的时候,响应式的回复我们内容,我们可以对这个空对象进行设置

Vue3.0中的响应式原理 说一下

get(target,propName){}有俩个参数,第一个是target指的是源数据对象person,第二个是propName就是我们读取的属性,例如p.name name就是propName

其中,为什么return要用[]这是因为动态为对象添加属性是,只能用中括号

js对象取值的两种方式(点和中括号)_js获取对象的值_小太阳...的博客-CSDN博客

set(target,propName,value){}而set就有三个参数,第一,二个跟上面一样。第三个是我们修改的值 

Vue3.0中的响应式原理 有人删除p的某个属性时调用

deleteProperty(target,propName){

                    console.log(`有人删除了p身上的${propName}属性,我要去更新界面了!`)

                    return delete (target[propName]

                }

 

Vue3的响应式原理--Reflect

在vue3底层当然不是用我们这么土的办法,该什么底层数据啊。

除了,普通点语法能获取对象的值,还有window.Reflect(es6)也能实现

Vue3.0中的响应式原理

Reflect.get()能获取对象的值

Vue3.0中的响应式原理 

Reflect.set()能修改对象的值

Vue3.0中的响应式原理 

Reflect.delete()可以删除一个对象的值 

当然用这个方式实现太麻烦了,那为什么要设计这个东西呢?

其实我ECMA这个脚本组织,现在正把Object中的一些api移接到Reflect

Vue3.0中的响应式原理

v3就是通过一个代理,一个反射 

总结:

实现原理

- 通过Proxy(代理):  拦截对象中任意属性的变化, 包括:属性值的读写、属性的添加、属性的删除等。
- 通过Reflect(反射):  对源对象的属性进行操作。

MDN文档中描述的Proxy与Reflect:

- Proxy:Proxy - JavaScript | MDN (mozilla.org)
- Reflect:Reflect - JavaScript | MDN (mozilla.org)

new Proxy(data, {
	// 拦截读取属性值
    get (target, prop) {
    	return Reflect.get(target, prop)
    },
    // 拦截设置属性值或添加新属性
    set (target, prop, value) {
    	return Reflect.set(target, prop, value)
    },
    // 拦截删除属性
    deleteProperty (target, prop) {
    	return Reflect.deleteProperty(target, prop)
    }
})

reactive对比ref

从定义数据角度对比:
  ref用来定义:基本类型数据
  reactive用来定义:对象(或数组)类型数据
  备注:ref也可以用来定义对象(或数组)类型数据, 它内部会自动通过 ``reactive``转为`<stro代理对象
从原理角度对比:
  ref通过 ``Object.defineProperty()``的 ``get``与 ``set``来实现响应式(数据劫持)。
  reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。
从使用角度对比:
  ef定义的数据:操作数据需要``.value``,读取数据时模板中直接读取不需要``.value``。
  reactive定义的数据:操作数据与读取数据:均不需要``.value``。文章来源地址https://www.toymoban.com/news/detail-415852.html

到了这里,关于Vue3.0中的响应式原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3响应式原理 私

    响应式的本质:当数据变化后会自动执行某个函数映射到组件,自动触发组件的重新渲染。 响应式的实现方式就是劫持数据,Vue3的reactive就是通过Proxy劫持数据,由于劫持的是整个对象,所以可以检测到任何对象的修改,弥补了2.0的不足。 名词解释: **副作用函数:**函数的

    2024年02月10日
    浏览(38)
  • 手写Vue3响应式数据原理

    我们想要对一个对象数据进行处理,从而实现更改dom。但如何更改对一个对象数据进行更改呢? vue2 的双向数据绑定是利⽤ES5 的⼀个 API ,Object.defineProperty()对数据进⾏劫持 结合 发布订阅模式的⽅式来实现的。 vue3 中使⽤了 ES6 的 ProxyAPI 对数据代理,通过 reactive() 函数给每⼀

    2024年02月11日
    浏览(47)
  • 【vue3源码系列#01】vue3响应式原理(Proxy)

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 在学习 Vue3 是如何进行对象的响应式代理之前,我想我们应该先去了解下 ES6 新增的API Proxy 与 Reflect ,可参考【Vue3响应式入门#02】Proxy and Reflect 。之

    2024年02月05日
    浏览(50)
  • 【Vue3响应式原理#01】Reactivity

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 以下是柏成根据Vue3官方课程整理的响应式书面文档 - 第一节,课程链接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文档可作为课程的辅助材料,

    2024年02月08日
    浏览(38)
  • Web前端 ---- 【Vue3】Proxy响应式原理

    目录 前言 安装Vue3项目 安装 Proxy 语法格式 从本文开始进入vue3的学习。本文介绍vue3中的响应式原理,相较于vue2中通过object.defineProperty(vue2中的响应式)来实现响应式,vue3中换成了Proxy来进行实现。 相较于vue2通过vue-cli脚手架来创建项目,这里更推荐使用create-vue来创建vue3的

    2024年01月16日
    浏览(68)
  • 【源码系列#02】Vue3响应式原理(Effect)

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 Vue3中响应数据核心是 reactive , reactive 的实现是由 proxy 加 effect 组合 ,上一章节我们利用 proxy 实现了一个简易版的 reactive,# 【源码系列#01】Vue3响应

    2024年02月05日
    浏览(41)
  • 【源码系列#01】vue3响应式原理(Proxy)

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 在学习 Vue3 是如何进行对象的响应式代理之前,我想我们应该先去了解下 ES6 新增的API Proxy 与 Reflect ,可参考【Vue3响应式入门#02】Proxy and Reflect 。之

    2024年02月05日
    浏览(48)
  • 【源码系列#05】Vue3响应式原理(Ref)

    ref: 接受一个参数值并返回一个响应式且可改变的 ref 对象。ref 对象拥有一个指向内部值的单一属性 .value 可以将 ref 看成 reactive 的一个变形版本,这是由于 reactive 内部采用 Proxy 来实现,而 Proxy 只接受对象作为入参,这才有了 ref 来解决值类型的数据响应, 如果传入 ref 的

    2024年02月03日
    浏览(32)
  • 【手撕源码】vue3响应式原理解析(文末抽奖)

    🐱 个人主页: 不叫猫先生 🙋‍♂️ 作者简介:2022年度博客之星前端领域TOP 2,前端领域优质作者、阿里云专家博主,专注于前端各领域技术,共同学习共同进步,一起加油呀! 💫优质专栏:vue3从入门到精通、TypeScript从入门到实践 📢 资料领取:前端进阶资料以及文中源

    2024年02月03日
    浏览(61)
  • 【Vue3响应式原理#02】Proxy and Reflect

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 以下是柏成根据Vue3官方课程整理的响应式书面文档 - 第二节,课程链接在此:Proxy and Reflect - Vue 3 Reactivity | Vue Mastery 本篇文章将解决 上一篇文章 结

    2024年02月05日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包