我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3 Reactive响应式原理逻辑详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3 Reactive响应式原理逻辑详解

前言

本篇文章主要讲解vue响应式原理的逻辑,也就是vue怎么从最开始一步步推导出响应式的结构框架。 先从头构建一个简单函数推导出Vue3的Reactive原理,最后再进行源码的验证。

一、怎么实现变量变化

怎么实现变量变化,相关依赖的结果也跟着变化

 当原本price=5变为price=20total应该变为40,但是实际total并不会改变。 解决办法可以这样,当变量改变了,重新计算一次,那么结果就会改变为最新的结果。

如果需要重新计算,我们需要将total语句存储为一个函数,才能实现依赖的变量改变就进行一次依赖项计算。这里就用effect表示函数名。

来,试一下:

 ?,实现了变量price改变,依赖变量price quantity的变量total也发生改变。

下一步,我们要解决的问题是:应该怎么把effect存储起来,让代码更加有通用性,而不是一直复写effect,分离出其他的功能的函数各司其职,也就是大家常说的解耦

二、怎么实现变量变化

怎么实现变量变化,变量改变后就取出effect执行

用什么存储effect呢?当然是用Set,因为Set会过滤出重复的元素,所以能够保证存储在Set中的函数不是重复的。 这里定义一个存储effect依赖的变量为dep = new Set(),定义track函数表示存储的过程。 定义trigger函数用以取出dep中相关的effect函数执行(这里定义的函数与Vue3源码同名同意义)。

  • effect: 会影响结果的函数(要实现响应式的依赖语句)
  • track:保存所有的effect
  • trigger: 当变量改变重新执行代码

 ?,解耦之后代码结构更清晰了。

下面需要解决的一个问题:一个object通常有多个属性,比如product = { price: 5, quantity: 2 },在保存依赖时只创建了一个dep的集合,应该给pricequantity都创建dep,因为total的最终结果依赖这两个属性,其中任何一个改变都要触发trigger函数。创建了两个dep就需要一个容器将dep存储起来。

三、将多个dep存储在Map中

因为不同的属性名有自己对应的dep,所以我们用Map结构(键值对形式)来保存不同dep

 ?,一个object的多个属性依赖问题解决,更具有通用性了。

下一个问题是:不可能只有一个对象,多个对象又怎么办?let product = { price: 5, quantity: 2 } let user = { firstName: "Joe", lastName: "Smith" },比如两个对象的时候就需要进一步修改上面的代码了。

四、将多个object的depsMap继续存储起来

这里用WeakMap数据结构去存储多个需要响应式的object的depsMapWeakMap的基本使用和Map差不多,只不过WeakMap只接受对象为键值,而depsMap是一个Map结构刚好(必须是)是对象类型。targetMap作为存储多个depsMap的容器名。

?,到这里已经基本实现了通用性的响应式代码了,但是还有最后一个问题就是:我们的代码都需要手动执行(自己添加trigger运行),不能自动运行。怎么让它能够自动检测变量改变,然后自动修改结果呢?

五、核心

通过Reflect和Proxy解决自执行问题

在JavaScript中,自动检测变量不就是get、自动修改变量不就是set吗?在Vue2.x版本中用ES5的Obeject.defineProperty()自带的getter/setter去解决这个问题。ES6中Proxy也能解决这个问题,但是Proxy不兼任IE浏览器,当时大家还讨论过说不知道尤大怎么去考虑这个问题,现在问题的答案就是——不考虑。也就是根本不考虑IE兼不兼容??。

Proxy就是代理的意思,任何对真实数据的操作它都能拦截并且代理操作,也就是说Object上一些能实现的方法,Proxy也能实现。Proxy使用语法是new Proxy(target, hanler)handler是你想实现什么样的代理功能配置。 而Reflect就更神奇了,它的作用是取代Object类上的一些方法让Obeject类更纯粹的代表一个类,不要附加太多方法在上面,比如a in obj表示判断obj中是否有a,在Reflect中用Reflect.has(a)比较语义化的方式就可以代替之前的方法。

正是因为这样,ProxyReflect就对应上了,都有Object上的方法。

稍微封装一下我们的函数,名叫Reactive

 ?,至此,Vue3基本的响应式原理就解析完了。

六、源码解析(TypeScript)

 returncreateReactiveObject函数,所以去看createReactiveObject

 前面的代码都是判断各种情况,我们就看最后几行

const observed = new Proxy(
    target,
    collectionTypes.has(target.constructor) ? collectionHandlers : baseHandlers
  )

可以看到ProxyhandlercollectionHandlers或者 baseHandlers,继续选择一个看一看。

在 baseHandlers中可以看到导出了get/set/deleteProperty等属性配置:

我们看一下set

 和我们之前的逻辑差不多,只不过真正实现就很复杂,因为有很多复杂条件需要去处理。

其他的get等方法也一样,做了很多条件判断处理,完善了每一种会出现的情况。

到此这篇关于Vue3 Reactive响应式原理逻辑详解的文章就介绍到这了,更多相关Vue3 Reactive响应式 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3 Reactive响应式原理逻辑详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue3 Reactive响应式原理是什么

一、怎么实现变量变化怎么实现变量变化,相关依赖的结果也跟着变化当原本price=5变为price=20后total应该变为40,但是实际total并不会改变。解决办法可以这样,当变量改变了,重新计算一次,那么结果就会改变为最新的结果。如果需要重新计算,我们需要将total语句存储为一个函数,才能实现依赖的变量改变就进行一次依赖项计算。这里就用effect表示函数名。来,试一下:实现了变量price改变,依赖变量pricequantity的变量total也发生改变。下一步,我们要解决的问题是:应该
2023-05-21

Vue3中的ref和reactive响应式原理解析

这篇文章主要介绍了Vue3中的ref和reactive响应式,本节主要介绍了响应式变量和对象,以及变量和对象在响应式和非响应式之间的转换,需要的朋友可以参考下
2022-11-13

vue3 reactive响应式依赖收集派发更新原理解析

这篇文章主要为大家介绍了vue3响应式reactive依赖收集派发更新原理解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-06

Vue3响应式方案及ref reactive的区别详解

众所周知ref和reactive都是用来作响应式数据,下面这篇文章主要给大家介绍了关于Vue3响应式方案及ref reactive区别的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
2022-12-19

一文详解Vue2/Vue3的响应式原理

在讲解之前,我们先了解一下数据响应式是什么?所谓数据响应式就是建立响应式数据与依赖(调用了响应式数据的操作)之间的关系,当响应式数据发生变化时,可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作,可以是DOM更新,也可以是执行一些回调函数。从Vue2到Vue3都使用了响应式,那么它们之间有什么区别?
2023-05-14

深入理解Vue3响应式原理

响应式就是当对象本身(对象的增删值)或者对象属性(重新赋值)发生变化时,将会运行一些函数,最常见的就是render函数,下面这篇文章主要给大家介绍了关于Vue3响应式原理的相关资料,需要的朋友可以参考下
2022-12-19

Vue3关于响应式数据类型详解(ref、reactive、toRef、及toRefs)

这篇文章主要介绍了Vue3关于响应式数据类型(ref、reactive、toRef、以及toRefs),本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-01-29

vue3 reactive响应式依赖收集派发更新原理是什么

proxyvue3已经从Object.property更换成Proxy,Proxy相比于前者可以直接监听对象数组,对于深层次的对象和数组,会把触发对应getter,然后去递归进行依赖收集,并不是直接像vue2暴力那样递归,总体而言性能更好对reactive传进来的对象进行Proxy进行劫持在内部进行依赖收集与通知更新操作functionreactive(raw){returnnewProxy(raw,{get(target,key){constres=Reflect.get(target,key
2023-05-16

如何解析Vue3的响应式原理

本篇文章给大家分享的是有关如何解析Vue3的响应式原理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Vue2响应式原理回顾// 1.对象响应化:遍历每个key,定义getter
2023-06-22

Vue3中reactive丢失响应式问题怎么解决

本篇内容主要讲解“Vue3中reactive丢失响应式问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3中reactive丢失响应式问题怎么解决”吧!问题描述:使用 reacti
2023-07-05

Vue3的响应式原理是什么

ProxyVue3的响应式原理依赖了Proxy这个核心API,通过Proxy可以劫持对象的某些操作。constobj={a:1};constp=newProxy(obj,{get(target,property,receiver){console.log("get");returnReflect.get(target,property,receiver);},set(target,property,value,receiver){console.log("set&q
2023-05-24

Vue3响应式原理实例分析

本篇内容介绍了“Vue3响应式原理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!回顾 vue2.x 的响应式实现原理:对象类型:通过
2023-07-02

详解Vue3中响应式的特殊处理

这篇文章主要为大家详细介绍了Vue3中响应式的一些特殊处理,文中的示例代码讲解详细,对我们深入了解Vue3有一定的帮助,需要的可以参考一下
2023-05-15

编程热搜

目录