位置: 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官方文档)

  • 苹果11按键音的关闭方法是什么(苹果11按键声音小是怎么回事)

    苹果11按键音的关闭方法是什么(苹果11按键声音小是怎么回事)

  • 电脑登录qq显示不能重复登录(电脑登录qq显示版本过低怎么办)

    电脑登录qq显示不能重复登录(电脑登录qq显示版本过低怎么办)

  • 荣耀v20有人脸识别功能吗(荣耀v20有人脸识别解锁吗)

    荣耀v20有人脸识别功能吗(荣耀v20有人脸识别解锁吗)

  • 微信聊天记录怎么彻底删除(微信聊天记录怎么导出来成文件)

    微信聊天记录怎么彻底删除(微信聊天记录怎么导出来成文件)

  • 美团信任分怎么开通(美团信任分怎么看涨了还是降了)

    美团信任分怎么开通(美团信任分怎么看涨了还是降了)

  • 照片宽33mm高48mm是多少像素(照片宽33mm高48mm是192宽高148)

    照片宽33mm高48mm是多少像素(照片宽33mm高48mm是192宽高148)

  • 苹果11pro max怎么删除软件(苹果11pro max怎么样)

    苹果11pro max怎么删除软件(苹果11pro max怎么样)

  • 三星s10e无法开机(三星s10不能开机)

    三星s10e无法开机(三星s10不能开机)

  • 苹果手机售后三包政策(苹果手机售后三亚)

    苹果手机售后三包政策(苹果手机售后三亚)

  • 计算机网络由哪几部份组成(计算机网络由哪些硬件组成)

    计算机网络由哪几部份组成(计算机网络由哪些硬件组成)

  • 一个人可以用两个微信吗(一个人可以用两个id账号吗)

    一个人可以用两个微信吗(一个人可以用两个id账号吗)

  • 怎样在wps文字中画横线(怎样在wps文字中设置常用短文)

    怎样在wps文字中画横线(怎样在wps文字中设置常用短文)

  • 大数据的起源是什么(大数据的起源是 A 互联网 B 证券 C 金融 D 公共管理)

    大数据的起源是什么(大数据的起源是 A 互联网 B 证券 C 金融 D 公共管理)

  • 序列号fd开头的是什么(序列号f.开头)

    序列号fd开头的是什么(序列号f.开头)

  • 手机没话费能收到验证码吗(手机没话费能收到快递取件码吗)

    手机没话费能收到验证码吗(手机没话费能收到快递取件码吗)

  • 淘宝店铺怎么发布预售(淘宝店铺怎么发布动态)

    淘宝店铺怎么发布预售(淘宝店铺怎么发布动态)

  • soul看对方主页有通知吗(soul对方主页落灰了,啥意思)

    soul看对方主页有通知吗(soul对方主页落灰了,啥意思)

  • 怎样查拼多多消费记录(怎样查拼多多消费账号)

    怎样查拼多多消费记录(怎样查拼多多消费账号)

  • 电压只有110v怎么解决(电压只有100伏怎么解决)

    电压只有110v怎么解决(电压只有100伏怎么解决)

  • qq距离感应器怎么关闭(qq电话取消距离感应)

    qq距离感应器怎么关闭(qq电话取消距离感应)

  • oppoa9x处理器是什么(oppoa9x手机处理器是什么)

    oppoa9x处理器是什么(oppoa9x手机处理器是什么)

  • appleid密码找回(iphoneid密码找回)

    appleid密码找回(iphoneid密码找回)

  • Win11怎么取消登录账户?Win11取消登录账户的方法(win11怎么取消登录pin密码)

    Win11怎么取消登录账户?Win11取消登录账户的方法(win11怎么取消登录pin密码)

  • 建筑企业印花税的计税依据
  • 公司注销章要销毁吗
  • 金蝶怎么增加凭证行数
  • 申报个税需要扣除公积金和社保吗
  • 别人给开的普通发票能抵扣多少税
  • 税费误差财务怎么调整
  • 二类经适房转商品房需要交多少钱
  • 新开商贸公司怎么做账和报税
  • 产品成本核算方法体系的内容包括
  • 办企业房权证费用多少
  • 何为提租补贴
  • 营业账簿印花税包括什么
  • 税控盘服务费跨年还能抵吗
  • 每月认证多少发票怎么算
  • 无法读取金税盘时间版本怎么解决
  • 国税未核定税种怎么处理
  • 案例分析关于拟建科学馆的请示报告
  • 查企业有记录吗
  • 技术服务税票
  • 企业所得税季报怎么申报
  • 增值税普通发票有什么用
  • win7 扫描仪
  • 经济成本和会计成本的大小
  • php数组函数题目
  • 收到材料未收到会计处理
  • 失控发票的企业如何处理
  • 固定资产成本中的相关税费
  • PHP:pg_field_name()的用法_PostgreSQL函数
  • 交所得税的会计科目
  • 购买原材料的运输费计入什么科目
  • 委托代销双方账务处理
  • 税务 终结执行
  • 即征即退增值税账务处理
  • php删除指定字符串
  • 微信小程序webview支付
  • 毕业证原件掉了可以报考社工证吗
  • python结合
  • web渗透违法吗
  • java webflux
  • 机器人折旧年限
  • php手机验证码验证
  • 车辆保险会计怎么做分录
  • sql模糊查询的关键字是什么
  • 应交税费减免税款的分录
  • 定期定额怎么申报个人所得税
  • 核定征收和查账征收报税有区别吗
  • 建筑业异地预缴税款怎么纳税申报
  • 成本类科目在哪里列式
  • 政府补贴资金如何记账
  • 公司向外借款给个人怎么做账
  • 固定资产抵账的账务处理
  • 个体工商户记账报税教程
  • 免税收入包括哪些项目
  • 餐饮服务的监管由哪个部门负责
  • 收到现金货款存入银行会计分录
  • 企业购买加油卡出售怎么做账
  • 账簿凭证的管理要求
  • xp系统弹出广告怎么处理
  • vista server
  • 虚拟机怎么安装VMware Tools
  • win10rs2是哪个版本
  • linux查看可执行命令
  • 本地磁盘安装
  • 进程 com surrogate
  • kvm支持的系统
  • linux如何使用数据库
  • linux必会的20种服务
  • python整数数字
  • android aoa
  • python的threading模块详解
  • jquery事件解绑
  • android有哪几个特点
  • 税务系统跨区调动
  • 事业编税务局
  • 河南12306区号
  • 办公室租金可以开专票抵扣进项税吗
  • 成都税务局网站首页
  • 杭州市各区面积人口排名
  • 地税服务费算什么科目
  • 农副产品营业执照范本
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设