问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

源码视角,Vue3为什么推荐使用ref而不是reactive

发布网友 发布时间:2024-09-26 08:23

我来回答

1个回答

热心网友 时间:2024-11-14 04:51

ref和reactive是Vue3中实现响应式数据的核心API。ref用于封装基本数据类型,而reactive用于处理对象和数组。尽管reactive似乎更适合处理对象,但Vue3官方文档更推荐使用ref。

官方文档指出,ref比reactive更适用。下面我们从源码的角度详细讨论这两个API,以及Vue3为什么推荐使用ref而不是reactive。

ref的内部工作原理是,它是一个函数,接受一个内部值并返回一个响应式且可变的引用对象。这个引用对象有一个.value属性,指向内部值。

在上述代码中,ref函数通过new RefImpl(value)创建了一个新的RefImpl实例。这个实例包含getter和setter,分别用于追踪依赖和触发更新。使用ref可以声明任何数据类型的响应式状态,包括对象和数组。

ref的核心是返回响应式且可变的引用对象,而reactive的核心是返回响应式代理,这是两者本质上的核心区别,也就导致了ref优于reactive。

reactive的内部工作原理是,它是一个函数,接受一个对象并返回该对象的响应式代理,也就是Proxy。

reactive的源码相对简单,通过new Proxy(target, baseHandlers)创建了一个代理。这个代理会拦截对目标对象的操作,从而实现响应式。

ref和reactive在声明数据的响应式状态上,底层原理不同。ref采用RefImpl对象实例,reactive采用Proxy代理对象。

当你使用new RefImpl(value)创建一个RefImpl实例时,这个实例大致上会包含以下几部分:Dep类负责管理一个依赖列表,并提供依赖收集和通知更新的功能。RefImpl类包含一个内部值_value和一个Dep实例。当value被访问时,通过get方法进行依赖收集;当value被赋予新值时,通过set方法触发更新。

尽管两者在内部实现上有所不同,但它们都能满足我们对于声明响应式变量的要求,但是reactive存在一定的局限性。

reactive的局限性包括仅对引用数据类型有效,使用不当会失去响应。reactive主要适用于对象,包括数组和一些集合类型(如Map和Set)。对于基础数据类型(如string、number和boolean),reactive是无效的。这意味着如果你尝试使用reactive来处理这些基础数据类型,将会得到一个非响应式的对象。

ref()为响应式编程提供了一种统一的解决方案,适用于所有类型的数据,包括基本数据类型和复杂对象。以下是推荐使用ref的几个关键原因:统一性、深层响应性和灵活性。

ref的核心优势之一是它的统一性。它提供了一种简单、一致的方式来处理所有类型的数据,无论是数字、字符串、对象还是数组。这种统一性极大地简化了开发者的代码,减少了在不同数据类型之间切换时的复杂性。

ref支持深层响应性,这意味着它可以追踪和更新嵌套对象和数组中的变化。这种特性使得ref非常适合处理复杂的数据结构,如对象和数组。

ref提供了高度的灵活性,尤其在处理普通赋值和解构赋值方面。这种灵活性使得ref在开发中的使用更加方便,特别是在进行复杂的数据操作时。

ref在Vue3中提供了一种更统一、灵活的响应式解决方案,还能避免了reactive的某些局限性。希望这篇文章对你有所帮助,有所借鉴。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? vue3源码阅读-reactive创建响应式对象 老汉捡到长满白发的“怪石”,专家看后立马报警,结果怎么样了? 一老头捡到“长白发”的石头,专家检测后,即刻封锁整个村子,是何... ...七岁读一年级可以吗?孩子在休学期间,父母应该怎么做呢? 京东买的iphone可以到线下售后吗 锦州铁合金厂电铝热法生产钛铁是真的吗? 2月11号是什么星座的 jm珍珠防晒喷雾怎么用 专柜价格是多少 jm珍珠防晒喷雾多少钱 jm防晒喷雾可以防晒几小时 耿马附近哪里有后期制作培训学校? 耿马附近哪里有DOM培训班在哪里? 耿马附近的交互设计培训学校在哪里? 耿马附近哪里有Bootstrap培训? 耿马附近哪里有设计培训中心在哪里? 耿马附近哪里有Bootstrap培训学校哪家比较正规? 耿马附近哪里有Bootstrap培训班哪家口碑好? 耿马北大青鸟包装设计培训怎么收费? 耿马附近哪里有iOS开发培训中心在哪里? 临沂产菜架竹吗 初一上册英语单词 初一上册的英语单词 Vue3响应式数组使用ref还是reactive? vue3中有没有reactive能做而ref做不了的场景? 求BEGIN的SMILE(一五一会バージョン) 求rainbow sunshine 分配歌词 丹阳到宜兴长途车 宜兴到丹阳汽车票多少钱? 从丹阳的界牌到宜兴怎么坐车才是最快的,我有急事的 宜兴到丹阳现在从哪个车站上车最早几点的 什么是金陵十二钗 红楼十二钗是哪十二钗?她们的最后结局是什么? 单反机尼康D60(18-55mm镜头)和佳能EOS 500D(18-55mm IS镜头)那个比较好... 单反相机的镜头分auto卡口和ai卡口? ...右脚大拇指被砸骨折了 我这算不算是工伤? 需要不需要做伤残鉴定?我... ...是有点肿,也没人看见,就是和旁人说了下脚被砸了,自己以为没什么事过... 大脚趾在工地被砸黑了干不活算工伤吗? 我爸上班脚被砸了导致骨裂,干不了活了,一干活就疼,,能算工伤吗,能要求... 可以给我<<借东西的小矮人亚莉亚蒂>> 粤语吗? yusian@hotmail.com_百度... 龟头边缘紫色是什么情况 龟头为什么是青紫色的 龟头是什么颜色的