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

  • 5方面打造外链建设提高网站权重(如何建立高质量的外链?)

    5方面打造外链建设提高网站权重(如何建立高质量的外链?)

  • 华为nova9双卡怎么放(华为nova9双卡怎么装)

    华为nova9双卡怎么放(华为nova9双卡怎么装)

  • 水星路由器怎么设置(水星路由器怎么设置上网)

    水星路由器怎么设置(水星路由器怎么设置上网)

  • dell update能卸载吗(dell 卸载更新)

    dell update能卸载吗(dell 卸载更新)

  • 手环不能提示微信通话(我的手环接不到微信提醒)

    手环不能提示微信通话(我的手环接不到微信提醒)

  • qq音乐最近常听多久更新(qq音乐最近常听怎么删除)

    qq音乐最近常听多久更新(qq音乐最近常听怎么删除)

  • 怎么识别苹果手机是不是原装(怎么识别苹果手机是不是组装机)

    怎么识别苹果手机是不是原装(怎么识别苹果手机是不是组装机)

  • 钉钉可以隐藏好友吗(钉钉隐藏好玩小游戏链接)

    钉钉可以隐藏好友吗(钉钉隐藏好玩小游戏链接)

  • 抖音换头像会被降权吗(抖音换头像被权限了怎么恢复啊)

    抖音换头像会被降权吗(抖音换头像被权限了怎么恢复啊)

  • 红包已领取但是没到账(红包已领取但是没收到)

    红包已领取但是没到账(红包已领取但是没收到)

  • retina屏什么意思(retina屏怎么样)

    retina屏什么意思(retina屏怎么样)

  • 电脑可以下载哔哩哔哩吗(电脑可以下载哔站吗)

    电脑可以下载哔哩哔哩吗(电脑可以下载哔站吗)

  • 关联qq后有什么功能(关联qq后会怎样)

    关联qq后有什么功能(关联qq后会怎样)

  • oppoa11x可以闪充吗(oppoa11x支持闪充吗?可以用闪充的插头吗?)

    oppoa11x可以闪充吗(oppoa11x支持闪充吗?可以用闪充的插头吗?)

  • word空白下划线怎么打(word空白下划线不显示,必须有字)

    word空白下划线怎么打(word空白下划线不显示,必须有字)

  • 魅族16s怎么设置锁屏密码(魅族16s怎么设置屏幕常亮)

    魅族16s怎么设置锁屏密码(魅族16s怎么设置屏幕常亮)

  • cad怎么永久加载插件(cad永久加载vlx文件)

    cad怎么永久加载插件(cad永久加载vlx文件)

  • 手机ip地址是固定的吗(手机ip地址是固定的还是经常变换的)

    手机ip地址是固定的吗(手机ip地址是固定的还是经常变换的)

  • iphone11跟11pro区别(iphone11和11pro差别)

    iphone11跟11pro区别(iphone11和11pro差别)

  • 怎么查看美团外卖账单(怎么查看美团外卖评价)

    怎么查看美团外卖账单(怎么查看美团外卖评价)

  • 5v4a多少w(5v4a是多少w充电速度)

    5v4a多少w(5v4a是多少w充电速度)

  • 支付宝怎么预约花呗还款日(支付宝怎么预约健康证办理)

    支付宝怎么预约花呗还款日(支付宝怎么预约健康证办理)

  • i912900ks什么水平(i9 9900ks什么意思)

    i912900ks什么水平(i9 9900ks什么意思)

  • 文件夹属性中没有共享选项卡(文件夹属性没有安全)

    文件夹属性中没有共享选项卡(文件夹属性没有安全)

  • 企业所得税留抵税额会显示在申报表上吗?
  • 印花税的计税依据为各种应税凭证上所记载的计税金额
  • 2021年白酒新政策
  • 税收分类编码如何查询
  • 税款的汇兑损益如何做账
  • 个体户4年不注销的后果消
  • 个人收取借款利息增值税
  • 残保金每次缴纳都是一样的吗
  • 基金投资债券会赔吗
  • 以固定资产换入原材料
  • 收到别人的承兑怎么入账
  • 所得税汇算清缴账务处理
  • 用白纸写的收据怎么入帐?
  • 股东补亏资金
  • 进项税发票认证流程
  • 外管证开了未用怎么办
  • 企业将自产产品发放给职工作为福利
  • 我们公司春节发工资英文
  • 开红字冲红发票 下个月怎么申报
  • 公司购买房产的税费
  • 集团内部资金借贷制度
  • 公司注销后是不是就不再接受诉讼
  • 酒店招募
  • 鸿蒙系统开发人员选项
  • 企业个人借款会计分录
  • 收取跨年租金会计处理
  • 营改增后固定资产报废处置收入计税
  • 配置eAccelerator和XCache扩展来加速PHP程序的执行
  • php返回对象
  • 企业通讯费管理办法
  • vite搭建项目
  • 巴塞罗那城市布局
  • 长期待摊费用的摊销分录
  • 个人出租车辆交税吗
  • nginx webservice
  • 定期定额征收超出3万怎么办
  • vim操作命令
  • 计入固定资产的条件
  • 个人个税汇算清缴怎么做
  • 个人佣金收入怎样交税
  • 还没报税就自动清卡了怎么办
  • 一般纳税人进项大于销项账务处理
  • 代收代缴水费可以加多少损耗
  • 用友软件中销售怎么做
  • 本月还未抄报,请抄报完成之后再申报
  • 其他应收款科目代码
  • 可抵扣进项税额包括进项税额转出吗
  • 监控 固定资产
  • 预付款属于什么会计分录
  • 工程预付款发票开什么明细项目
  • 在网上订机票怎么订
  • 设备丢失查找
  • mysql中自增
  • sqlserver日志已满
  • 3种不用重装的手机
  • 复制文件文件名过长怎么复制
  • 桌面开始菜单跑到右边去了怎么办
  • win8怎么打开系统设置
  • Ubuntu 14.10 “Utopic Unicorn”正式发布(附下载)
  • windows8内存
  • linux下scp远程拷贝包含空格的目录或者文件的解决方法
  • win7系统电脑蓝牙在哪里
  • windows mobile
  • linux 用户进程
  • win102021更新
  • 红石id
  • linux tar命令安装
  • ExtJs扩展之GroupPropertyGrid代码
  • 人应该掌握的基本知识
  • gpu缩放在哪里打开
  • nodejs基本原理
  • recycleview使用
  • 跟我从零基础学到了什么
  • 安卓手机命令代码
  • js中遍历的方法
  • android中fragment
  • 厂房出租开增值税专用发票
  • 企业所得税报错了税款扣了可以改吗
  • 福建省税务局举报中心
  • 山东税务师协会官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设