当前位置:首页 > 科技  > 软件

面试官:Vue3中什么是Reactive的懒响应性?

来源: 责编: 时间:2024-04-11 17:31:00 282观看
导读Hello,大家好,我是 Sunday。Reactive 的懒响应性 可能很多同学之前没有听说过这个概念。最近一个同学在面试中就被问到了这个问题。所以说,咱们今天就借助这篇文章来看下:在vue3中,什么是 Reactive 的懒响应性?01:Reactive

Hello,大家好,我是 Sunday。Y6d28资讯网——每日最新资讯28at.com

Reactive 的懒响应性 可能很多同学之前没有听说过这个概念。最近一个同学在面试中就被问到了这个问题。所以说,咱们今天就借助这篇文章来看下:在vue3中,什么是 Reactive 的懒响应性?Y6d28资讯网——每日最新资讯28at.com

01:Reactive 的实现原理

Reactive 是基于 Proxy 进行实现的,这个概念很多同学都是知道的。我们可以通过 vue 的源码来看下这个实现:Y6d28资讯网——每日最新资讯28at.com

图片图片Y6d28资讯网——每日最新资讯28at.com

代码比较复杂,大家可以只看我红框中的内容Y6d28资讯网——每日最新资讯28at.com

通过上图红框中的代码,我们可以很清晰的看到在 Reactive 里面,Vue 最终通过 new Proxy 的方式生成了一个 Proxy 的实例对象。 这个 Proxy 的实例就是 reactive() 方法调用时的返回值。Y6d28资讯网——每日最新资讯28at.com

我们可以通过如下伪代码表示:Y6d28资讯网——每日最新资讯28at.com

function reactive (target) {  return new Proxy(target, {....})}const test = reactive({name: '张三'})

在这种情况下,{name: '张三'} 就会被包装成一个 响应式对象,proxy 通过监听它的 getter、setter 行为来触发响应性。Y6d28资讯网——每日最新资讯28at.com

02:Proxy 的问题

Proxy 可以代理对象,这个是没有问题的。但是:Proxy 只能代理一层对象,而不能代理多层。Y6d28资讯网——每日最新资讯28at.com

什么意思呢?假如当 代理对象 具备层级嵌套的时候,proxy 是不可以代理子层级的。我们可以通过以下代码来进行测试:Y6d28资讯网——每日最新资讯28at.com

const target = {    name: '张三',    child: {      name: '小张三'    }  }  const p = new Proxy(target, {    set(target, property, value, receiver) {      console.log('触发了 set');      target[property] = value      return true    },    get(target, property, receiver) {      console.log('触发了 get');      return target[property]    }  })  p.name = '李四'  // 打印:触发了 set  p.child.name = '小李四' // 打印:触发了 get。注意:并没有触发 child 的 set

在上述代码中,我们利用 proxy 代理了 target 对象。注意:此时的 target 是存在嵌套的复杂数据类型 child。Y6d28资讯网——每日最新资讯28at.com

当我们执行 p.name = '李四' 时,触发 set 行为,这是一个很正常的逻辑。但是,当我们执行 p.child.name = '小李四' 时,我们会发现 仅触发了一个 get(p.child),而没有触发 set 行为。Y6d28资讯网——每日最新资讯28at.com

这就证明:对于 Proxy 而言, 它只能代理 一层 的复杂数据类型,而不可以代理多层。Y6d28资讯网——每日最新资讯28at.com

但是,在 Vue 中 多层的 Reactive 对象却可以实现响应性,那么这是如何做到的呢? 具体的方式就是 Reactive的懒响应性。Y6d28资讯网——每日最新资讯28at.com

03:Reactive的懒响应性

我们观察 Vue 的源码,在源码监听 proxy getter 行为的地方,存在这样一段代码(我把代码稍微做了一些调整,让大家看的可以更加清晰):Y6d28资讯网——每日最新资讯28at.com

图片图片Y6d28资讯网——每日最新资讯28at.com

核心的代码就在红框的位置,其中的 res 大家可以理解为 target[property] 。Y6d28资讯网——每日最新资讯28at.com

而根据 01:Reactive 的实现原理 我们知道 reactive 方法本质上就是生成了一个 Proxy 实例。所以说,这里的代码核心其实就是 一旦获取到的属性是对象,则会为该对象再次执行 reactive 方法Y6d28资讯网——每日最新资讯28at.com

如果用伪代码表示,就是下面这样:Y6d28资讯网——每日最新资讯28at.com

图片图片Y6d28资讯网——每日最新资讯28at.com

即:再次通过 Proxy 完成代理,并返回Y6d28资讯网——每日最新资讯28at.com

所以说,所谓的 Reactive的懒响应性 指的就是:Reactive 最初只会为复杂数据类型执行第一层的响应性。如果存在多层的复杂数据类型嵌套时,则会在使用到(getter 行为)该子集时,才会再次为该子集包装 proxy(执行 reactive 方法)Y6d28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-82949-0.html面试官:Vue3中什么是Reactive的懒响应性?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Rust语言入门:Hello World示例

下一篇: 聊聊Rust里面的数据类型

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 消息称迪士尼要拍真人版《魔发奇缘》:女主可能也找黑人演员

    8月5日消息,迪士尼确实有点忙,忙着将不少动画改成真人版,继《美人鱼》后,真人版《白雪公主》、《魔发奇缘》也在路上了。据外媒消息称,迪士尼将打造真人版
  • 跑分安卓第一!Redmi K60至尊版8月发布!卢伟冰:目标年度性能之王

    8月5日消息,Redmi K60至尊版将于8月发布,在此前举行的战略发布会上,官方该机将搭载搭载天玑9200+处理器,安兔兔V10跑分超177万分,是目前安卓阵营最高的分数
  • 如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • Flowable工作流引擎的科普与实践

    一.引言当我们在日常工作和业务中需要进行各种审批流程时,可能会面临一系列技术和业务上的挑战。手动处理这些审批流程可能会导致开发成本的增加以及业务复杂度的上升。在这
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 2纳米决战2025

    集微网报道 从三强争霸到四雄逐鹿,2nm的厮杀声已然隐约传来。无论是老牌劲旅台积电、三星,还是誓言重回先进制程领先地位的英特尔,甚至初成立不久的新
  • iQOO Neo8 Pro抢先上架:首发天玑9200+ 安卓性能之王

    经过了一段时间的密集爆料,昨日iQOO官方如期对外宣布:将于5月23日推出全新的iQOO Neo8系列新品,官方称这是一款拥有旗舰级性能调校的作品。随着发布时
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top