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

  • 披萨怎么画才好看又好吃(ps怎么合成图片)(披萨怎么画才好看)

    披萨怎么画才好看又好吃(ps怎么合成图片)(披萨怎么画才好看)

  • ipad2021是第几代(ipad2021是第几代怎么样)

    ipad2021是第几代(ipad2021是第几代怎么样)

  • 哈罗单车骑行卡怎么退卡(哈罗单车骑行卡自动续费是什么意思)

    哈罗单车骑行卡怎么退卡(哈罗单车骑行卡自动续费是什么意思)

  • 海星模拟器怎么用金手指(海星模拟器怎么设置2p)

    海星模拟器怎么用金手指(海星模拟器怎么设置2p)

  • 荣耀语音助手怎么唤醒(荣耀语音助手怎么设置)

    荣耀语音助手怎么唤醒(荣耀语音助手怎么设置)

  • 网易云听歌历史记录在哪里(网易云听歌历史数据)

    网易云听歌历史记录在哪里(网易云听歌历史数据)

  • 苹果xr面容识别不了(苹果xr面容识别不了 要输入密码才识别)

    苹果xr面容识别不了(苹果xr面容识别不了 要输入密码才识别)

  • 浏览器无痕模式在哪里(浏览器无痕模式有什么用)

    浏览器无痕模式在哪里(浏览器无痕模式有什么用)

  • 无线围栏是什么(无线围栏是什么样子的)

    无线围栏是什么(无线围栏是什么样子的)

  • 苹果手机删除不了照片怎么回事(苹果手机删除不了app怎么回事)

    苹果手机删除不了照片怎么回事(苹果手机删除不了app怎么回事)

  • 华为nova7有nfc吗(华为nova7手机有nfc功能吗)

    华为nova7有nfc吗(华为nova7手机有nfc功能吗)

  • 充电只充到80正确吗(为什么充电只到80)

    充电只充到80正确吗(为什么充电只到80)

  • 快手无法登录是怎么回事(快手无法登陆)

    快手无法登录是怎么回事(快手无法登陆)

  • 电脑wps表格怎么发送(电脑wps表格怎么调整表格大小)

    电脑wps表格怎么发送(电脑wps表格怎么调整表格大小)

  • mate20怎么关闭后台程序(华为mate20怎么关)

    mate20怎么关闭后台程序(华为mate20怎么关)

  • 华为手机是不是有碎屏保(华为手机是不是有个隐私页面)

    华为手机是不是有碎屏保(华为手机是不是有个隐私页面)

  • id card全称(id card全称怎么读)

    id card全称(id card全称怎么读)

  • 1809a01是什么型号(18096a是什么意思)

    1809a01是什么型号(18096a是什么意思)

  • ipad可以连接小米蓝牙耳机吗(iPad可以连接小米无线耳机吗)

    ipad可以连接小米蓝牙耳机吗(iPad可以连接小米无线耳机吗)

  • 手机录音怎么删除(手机录音怎么删除掉)

    手机录音怎么删除(手机录音怎么删除掉)

  • 苹果微信后台收不到消息怎么办(苹果手机微信收取中怎么解决)

    苹果微信后台收不到消息怎么办(苹果手机微信收取中怎么解决)

  • 计算机病毒是(计算机病毒是什么)

    计算机病毒是(计算机病毒是什么)

  • 微信不能收红包提示绑定银行卡(没有实名制微信不能收红包)

    微信不能收红包提示绑定银行卡(没有实名制微信不能收红包)

  • Windows 10如何调整鼠标指针大小(windows10如何调出虚拟键盘)

    Windows 10如何调整鼠标指针大小(windows10如何调出虚拟键盘)

  • 格里姆瑟尔山口Totesee山地湖中倒映出的星星,瑞士伯尔尼 (© magodevita/Getty Images)(格里姆火山)

    格里姆瑟尔山口Totesee山地湖中倒映出的星星,瑞士伯尔尼 (© magodevita/Getty Images)(格里姆火山)

  • 收到退个税手续费要交增值税吗?
  • 买房契税缴纳比例
  • 支出算什么会计科目
  • 超市的库存商品分类混乱怎么看出来的
  • 工程图纸设计费用收费标准
  • 已经缴纳的税款怎么做账
  • 负利润的话小型微利企业减免企业所得税吗
  • 收到项目投资款账务处理
  • 开发票商品类别与商品明细的区别
  • 季度预缴能不能弥补亏损
  • 财政拨款税收政策
  • 给员工购买意外险进项税能不能抵扣
  • 应收票据主要包括
  • 评估增值的差额是什么
  • 专用发票扣税
  • 报表中利润为什么税后比税前大?
  • 计提厂房租金怎么做账?
  • 小规模企业增值税税率
  • 门店关闭费用怎么处理
  • 试营业期间的费用算不算开办费?
  • 2019年出租车
  • 出口退税生产企业税率
  • 经营性租赁 会计准则
  • 发物流货物损坏怎么赔偿
  • 公司换基本户需要多久
  • 鸿蒙系统怎样开启5G
  • 公司奖金没有按时发可以要吗
  • 升级w10系统
  • 房屋产权置换协议书范本
  • 委托证券公司发行股票的手续费计入什么科目
  • 工程建设的项目的划分?
  • 框架导入
  • php处理异常
  • vue导航解析流程
  • 经典目标检测算法
  • python condition条件变量
  • 以前年度亏损要调整吗
  • 抵债不动产处置如何征税
  • 幼儿园固定资产说明怎么写
  • 个体户生产经营所得
  • 限售股算不算账户资产
  • 委托代销安排的迹象有哪些
  • 关税 账务处理
  • 专利技术会计分录怎么做
  • 以前年度损益调整会计分录
  • 支付给外包公司的工资和保险费
  • 纳税人延期缴纳税款
  • 商业折扣,现金折扣,销售折让
  • 哪些资产减值损失确认过后是可以转回的
  • mysql 基本操作
  • 世界杯猜测
  • truncate可以删除部分数据
  • centos怎么样
  • 彻底关闭windows10自动更新工具
  • winxp注销快捷键
  • ubuntu ftp服务器怎么搭建
  • 苹果官网
  • win8怎么禁止弹窗
  • win7点关机关不了
  • Apache 2.0.55 for Linux 下载
  • excel表格文本形式在哪里
  • Zen Coding css,html缩写替换大观 快速写出html,css
  • perl 时间转换
  • Sublime Text + decoda 调试Quick-cocos2d-x 游戏
  • nodejs document
  • 可序列化的类被标记为
  • pycharm中文教程
  • 完美解决怠速抖动加油就平稳
  • 统计一组数据各个数字出现的次数
  • jquery并列选择器
  • JavaScript Try...Catch 声明的 使用方法
  • android存储方式
  • 知道金额和税额怎么求
  • 税率是从什么时候有17%改为13%的呢
  • 税务局航天信息的操作流程
  • 2008年深圳房价崩盘
  • 成都网上税务局
  • 国家税务总局34号
  • 汽车销售顾问有前途吗
  • 应聘保险公司需要了解什么
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设