位置: IT常识 - 正文

讲讲vue3下会造成响应式丢失的情况

编辑:rootadmin
讲讲vue3下会造成响应式丢失的情况 题引:

推荐整理分享讲讲vue3下会造成响应式丢失的情况,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

在我们从vue2过渡到vue3的时候,对于数据响应式的变化其实是懵懵懂懂的。从以往直接在data函数里面定义变量到每一次都要使用ref/reactive时,是有些不适应的。但问题不大,毕竟在大前端时代中,如果不及时跟上时代的步伐,不仅技术没跟上,面试还容易被卡。所以今天来聊聊在使用vue3开发时对于数据响应式的理解。

vue3的响应式是基于 proxy

从vue2的 Object.defineProperty 到vue3的 proxy 可谓是一个质的飞跃。vue2的响应式是需要递归+遍历每一个对象的属性进行数据劫持,而在vue3中只需要对对象层进行监听即可。好了话不多说,开始讲解一些常见的响应式问题。

ref和reactive之间的关系

如果我们用ref定义基本类型时,实际上还是使用 Object.defineProperty 进行数据劫持监听。但如果是定义引用类型时,底层代码上是借用 reactive 函数进行数据劫持的。因此ref和reactive关系是紧凑的。通过源码的我们是可以确认的。

我们可以看到,this_value = useDirectValue ? newVal : toReactive(newVal) 是进行了判断,而 useDirectValue 是进行判断是否是浅层的、仅可读的数据。 那么如果我们传入的是一个对象,那么就会进入 toReactive(newVal) 这一步。 toReactive 函数就是进行reactive定义的函数入口。

reactive定义的变量重新赋值会失去响应式,而ref不会讲讲vue3下会造成响应式丢失的情况

我们一开始接触vue3的时候,会对这个问题十分的不解,只是知道有这个问题而不知其根,今天就来讲讲这个问题。

import {ref,reactive} from 'vue';let test = {age:2};let obj = reactive({age:1})let obj1 = ref({age:1})obj = test; obj1.value = test;

通过reactive()包含的对象是进行了内部的proxy代理,因此具有响应式。但是像test这个对象,它是没有进行数据劫持的,而对象赋值的时候实际上是引用地址赋值。那么obj这个对象变成了一个没有数据劫持的引用地址,那么它也就失去了响应式。但是obj1重新赋值时会保留自身的响应式。其实很简单,跟上图的代码是有关的。细心的人会发现,在 set 函数里面有这么一段代码。

是的,在我们对ref定义的变量重新赋值时会进入 set 函数,且重新赋值的是一个对象的话,那么它会再次进入 toReactive 函数进行数据劫持,这就是为什么ref定义的变量重新赋值对象时依旧保留响应式的根本原因。

解构响应式对象会造成响应式丢失

通过上面我都知道,不管是ref还是reactive定义的对象变量,都会经过 reactive 函数来进行proxy代理。但是即使是对象,也会出现响应式丢失的情况。

<script setup>import {reactive,onMounted} from 'vue';let obj = {a:18,aa:{age:18},aaa:{friend:{age:18}}}let rect = reactive(obj);let {a,aa,aaa} = rect;onMounted(()=>{setTimeout(()=>{a = 2;aa.age = 2;aaa.friend.age = 2;},2000)})</script><template><div>{{a}}</div><div>{{aa.age}}</div><div>{{aaa.friend.age}}</div></template>

上面的运行结果就是,a变量没有响应式,aa和aaa都是响应式。这是因为在解构赋值中,如果是原始类型的话是按照值传递,如果是引用类型的话是按照引用地址传递。除此之外 reactive() 定义的变量中 get函数 有这样的一个处理

a = rect.a; //rect.a是一个基本类型,所以是直接赋值aa = rect.aa; //rect.aa是一个引用类型,在内部处理时触发条件判断,且非可读对象即从Map数据结构中返回已经代理的响应式对象aaa = rect.aaa //跟rect.aa一个道理

因此以后对响应式对象进行解构时,记住以上的内部判断逻辑就可以拿捏它们了(#.#)。当然,对vuex或者pinia的取值也是这个道理,也就是为什么需要借助 computed() 来实现响应式了。因此 computed() 能返回响应式。

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。

有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文链接地址:https://www.jiuchutong.com/zhishi/299326.html 转载请保留说明!

上一篇:Conda常见命令总结(conda操作)

下一篇:【java web篇】MyBatis之Mapper代理(javaweb官方文档)

  • 微信怎么搜索群(微信怎么搜索群加入)

    微信怎么搜索群(微信怎么搜索群加入)

  • vivox70怎么设置返回键(vivox70怎么设置定时开关机)

    vivox70怎么设置返回键(vivox70怎么设置定时开关机)

  • 荣耀x10和华为nova7se的对比(荣耀X10和华为nova65G哪个好)

    荣耀x10和华为nova7se的对比(荣耀X10和华为nova65G哪个好)

  • 小米10pro支持无线充电吗(小米10pro支持qi无线充电吗)

    小米10pro支持无线充电吗(小米10pro支持qi无线充电吗)

  • 微信解封为什么要刷脸(微信解封为什么显示绑卡信息不一致)

    微信解封为什么要刷脸(微信解封为什么显示绑卡信息不一致)

  • 闲鱼发布商品搜索不到是哪些原因导致的(闲鱼发布商品搜不到 超过5天)

    闲鱼发布商品搜索不到是哪些原因导致的(闲鱼发布商品搜不到 超过5天)

  • 插件不受支持怎么解决(电脑显示插件不受支持)

    插件不受支持怎么解决(电脑显示插件不受支持)

  • 华为手机如何设置自动关机(华为手机如何设置时间)

    华为手机如何设置自动关机(华为手机如何设置时间)

  • 抖音金币怎么提现(抖音金币怎么提升)

    抖音金币怎么提现(抖音金币怎么提升)

  • 微信注销后绑定的手机号会自动解绑吗(微信注销后绑定的app会解绑吗)

    微信注销后绑定的手机号会自动解绑吗(微信注销后绑定的app会解绑吗)

  • 微信用不了wifi 但是其他软件都可以(小米手机微信用不了wifi)

    微信用不了wifi 但是其他软件都可以(小米手机微信用不了wifi)

  • 手机不充电就关机怎么办(手机不充电就关机了这是为什么)

    手机不充电就关机怎么办(手机不充电就关机了这是为什么)

  • 华为手机解除安全模式(华为手机解除安装未知应用)

    华为手机解除安全模式(华为手机解除安装未知应用)

  • 手机号销户后多久为空号(手机号销户后多久可办新号)

    手机号销户后多久为空号(手机号销户后多久可办新号)

  • 微信看不见对方朋友圈是被删了吗(微信看不见对方头像是怎么回事)

    微信看不见对方朋友圈是被删了吗(微信看不见对方头像是怎么回事)

  • console.log()的作用(console.log()的作用输出数据案例)

    console.log()的作用(console.log()的作用输出数据案例)

  • 手机bilibili下载的视频在哪个文件夹

    手机bilibili下载的视频在哪个文件夹

  • etc显示标签已失效还能用吗(ETc显示标签已失效,把卡安插两次可以吗)

    etc显示标签已失效还能用吗(ETc显示标签已失效,把卡安插两次可以吗)

  • 手机软件不兼容怎么办(手机软件不兼容的解决方法)

    手机软件不兼容怎么办(手机软件不兼容的解决方法)

  • 天猫所有榜单在哪里看(天猫榜单在哪看)

    天猫所有榜单在哪里看(天猫榜单在哪看)

  • 优酷app扫码在哪(优酷APP扫码在哪里)

    优酷app扫码在哪(优酷APP扫码在哪里)

  • 怎样清理浏览器缓存(怎样清理浏览器的缓存和垃圾手机)

    怎样清理浏览器缓存(怎样清理浏览器的缓存和垃圾手机)

  • 电脑开始菜单在哪里(电脑开始菜单在右边怎么调回来)

    电脑开始菜单在哪里(电脑开始菜单在右边怎么调回来)

  • 新版Win10中,如何仅修改部分文本大小

    新版Win10中,如何仅修改部分文本大小

  • 新领的发票怎么分发
  • 小微企业税收优惠政策2023年
  • 疫情期间社保单位不交个人吃亏吗
  • 建筑公司劳务分包抵扣分录
  • 社保是当月计提当月的吗
  • 礼品费如何报销
  • 工程预缴税款流程
  • 个人抬头发票可以抵税个人所得税吗
  • 外购原材料自用
  • 会计政策变更与会计估计的审计
  • 计提坏账准备为什么要加借方
  • 暂估入库商品用什么科目
  • 五分钟了解外出经营活动税收管理证明
  • 去税务局税种认定需要带什么资料
  • 2019年水利部
  • 公司结算工资
  • 工程物资建设期间盘盈盘亏
  • 工资个人所得税标准表
  • 营业执照五证合一图片
  • 怎么计算研发费用占销售收入总额比例
  • 费用提多了利润少了所得税是如何调整?
  • 利息保障倍数如何计算
  • 建账时选择什么会计制度
  • 网络适配器感叹号代码43
  • 微信占用空间大是怎么回事
  • 忘记用户登录密码怎么办
  • 不动产经营租赁包括哪些内容
  • php根据日期判断星座
  • 缅因州达马里斯科塔地区的佩马基德灯塔 (© Tom Whitney/Adobe Stock)
  • 金融机构贷款利息规定
  • 委托加工物资如何转入生产成本
  • 没有资质证书的公司可靠吗?
  • php中常量名命名规范
  • 【JavaScript】【5】定时器(包含回调函数与Promise)
  • ai作画
  • gpt3 plug
  • 超参数及其作用
  • sort文件名
  • inotify_event
  • 企业餐具属于流动资产吗
  • 企业的应交税金一般通过什么科目核算
  • element remove
  • bootstrapstandby
  • 建安企业确认收入的依据
  • 什么是备抵类账户
  • 哪些企业可以不计提盈余公积
  • mysql字符串索引如何排序
  • 差旅费津贴怎么报税
  • 支付招标代理费的请示
  • 营业收入是指从全部营业收入中扣除
  • 开发成本期末有余额吗
  • 投资收益影响营业额吗
  • 分期收款发出商品是什么意思
  • 出纳属于会计岗位职责吗
  • 母公司孙子公司
  • 年末资产减值损失可以税前扣除吗
  • 应交税费应交增值税借贷方向
  • 业务招待费礼品要扣个税吗
  • 2019年新政府会计准则解读
  • 银行汇票和银行本票区别图解
  • wcu.exe是什么
  • win10系统预览版
  • 什么是bash命令
  • win7系统如何删除隐藏文件
  • windows7右下角网络图标不见了怎么办
  • 修改windows server2012服务器密码
  • python如何搭建环境
  • 学javascript可以干什么工作
  • eclipse开发安卓app实例
  • python全角半角
  • 自定义view ondraw
  • javascript 函数
  • ios反编译源代码
  • 第五章推动经济高质量发展心得
  • 支付给境外的咨询费需要什么资料
  • 异地如何拨打12393
  • 建筑单位外地缴税
  • 贵阳市税务局投诉电话号码
  • 交完车船税后地税局都给什么
  • 内江市税务局
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设