位置: IT常识 - 正文

vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析(vue3 计算属性)

编辑:rootadmin
vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析

推荐整理分享vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析(vue3 计算属性),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue2计算属性,vue计算属性不触发,vue2计算属性,vue3 计算属性,vue中的计算属性可以有参数吗,vue计算属性setter,vue使用计算属性,vue使用计算属性,内容如对您有帮助,希望把文章链接给更多的朋友!

点击可打开demo 这里在一秒后改了数组里value属性的值 虽然数据有更新,但打开控制台,可以发现computed函数只在初始化时执行了一次 按理说一秒后改变了value值,应该执行两次才对呀? 但如果computed属性这样写,明确写明展开了每一项,获取到了value属性,就能执行第二次 vue的文档里提到,计算属性的方法只应该有单纯的计算,不要产生其他效果,像我们上面的demo,虽然数据有更新,但console.log没打印,这里的console.log其实就算是文档里的side effects 为什么会有这种表现呢?

看看vue的源码吧!顺便学习一下computed是如何实现的!

这里先说整体思路 这里用了proxy,对所有响应式对象加proxy,这样就能改他们的get和set等方法,然后当读取计算属性时,执行computed里的方法,执行的时候,会读取到其依赖的响应式对象,因为之前改了他们的set方法,所以此时能知道读取的是哪个对象的什么属性,此时就能把他加到computed属性的依赖中。但依赖的值发生改变,因为用proxy改过其get方法,同时之前收集过依赖,知道这个依赖值被哪些值所依赖,就能去触发更改。 接着看实际实现 我们对变量设为响应式对象,会用ref方法,ref方法的实现中调用了toReactive toReactive调用了reactive

reactive调用createReactiveObject,并把mutableHandlers传入了参数

createReactiveObject使用了proxy,把mutableHandlers作为proxy的handler

vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析(vue3 计算属性)

然后我们看看handler是怎么做的

可以看到当get时,即获取响应式对象值时,调用了track方法,这里就是在收集依赖了,当我们在computed方法获取响应式对象时,这个computed就作为了target传入去,现在看看track方法做了什么 这里是{target -> key -> dep}的两个map,target就是每一个响应式对象,key就是这个对象上的属性名,dep里就存放了依赖这个属性的响应式对象列表,可以看到下面trackEffects函数里,有一行dep.add(activeEffect) 这里的activeEffect就是当前在运行的响应式对象,就是computed计算属性,被加到dep里了。因此,在computed里用到的其他响应式对象,当computed被执行时,其他响应式对象对应属性里就会维护一个列表,列表里放的是依赖这个属性的响应式对象,依赖收集完成。 之后就是触发了 这里用proxy改了set方法,会去调用trigger函数

看看trigger函数如何实现 trigger函数的target是改了值的响应式对象本身,key是更改的属性名,然后从刚刚说的{target -> key -> dep}两个map里,拿到依赖这个对象这个key的列表deps,这里还能看到如果改的是length,还会有额外操作,感兴趣的可以去看源码,在effect.ts文件。 之后就调用triggerEffects方法,参数其实就是deps,

然后就会去调用triggerEffect(说实话,我还没看到为啥355和360行的代码要这样写),这里如果有scheduler就会去执行,这里的scheduler是构造函数的第二个参数

能找到是在ComputedRefImpl的构造函数赋值的,这里会把dirty改为true,然后会调用triggerRefValue triggerRefValue有调用triggerEffects了,是不是很熟悉?没错是解决假设你的计算属性被其他计算属性所以的,就会继续triggerEffects下去 那实际在哪里改变值呢?还记得刚刚把dirty改为true了吗?computed的实现了,get函数如果dirty为true,就会重新计算 这样,computed就更新了。

看完源码,终于懂了!如果在计算属性里没有明确获取某个响应式对象的某个key,那改了这个key,是不会重新执行computed的,所以就会有开头demo的现象。

回到文档

因此,如果我仍想要有side effects,又不肯换watchers,可以明确获取一下会改变的属性值。但要记住这个知识点,可能相比有side effects就用watchers更复杂吧? 除非代码很多,难得改🐶

有不懂欢迎评论,一起探讨

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

上一篇:vue2移动端使用vue-qrcode-reader实现扫一扫功能(vue 移动端)

下一篇:同步与异步的认识(同步和异步的关系)

  • iphonex壁纸尺寸怎么调(iphonex 壁纸尺寸)

    iphonex壁纸尺寸怎么调(iphonex 壁纸尺寸)

  • 抖音怎么拍时间长一点的视频(抖音怎么拍时间长的视频)

    抖音怎么拍时间长一点的视频(抖音怎么拍时间长的视频)

  • 屏幕镜像打不开怎么办(屏幕镜像打不开不停的转)

    屏幕镜像打不开怎么办(屏幕镜像打不开不停的转)

  • 荣耀20s怎么分屏(荣耀20s如何分屏)

    荣耀20s怎么分屏(荣耀20s如何分屏)

  • 加好友频繁多久才解封(加好友频繁多久才可以加QQ)

    加好友频繁多久才解封(加好友频繁多久才可以加QQ)

  • 华为电脑和荣耀电脑的区别(华为电脑和荣耀手机同屏)

    华为电脑和荣耀电脑的区别(华为电脑和荣耀手机同屏)

  • mix2有没有红外遥控(红米mix2有红外吗)

    mix2有没有红外遥控(红米mix2有红外吗)

  • ios储存空间与app测出不同(ios 储存空间)

    ios储存空间与app测出不同(ios 储存空间)

  • 为什么人脸识别多次失败(为什么人脸识别突然不能用了)

    为什么人脸识别多次失败(为什么人脸识别突然不能用了)

  • qq里的一起听歌怎么弄(QQ里的一起听歌谁控制)

    qq里的一起听歌怎么弄(QQ里的一起听歌谁控制)

  • hd什么意思在手机左上角(hd什么意思在手机左上角怎么关闭)

    hd什么意思在手机左上角(hd什么意思在手机左上角怎么关闭)

  • 爱思助手能检测出苹果零件有没有被换过吗(爱思助手能检测苹果手表吗)

    爱思助手能检测出苹果零件有没有被换过吗(爱思助手能检测苹果手表吗)

  • 小爱音箱可以车上用吗(小爱音箱车载电源线)

    小爱音箱可以车上用吗(小爱音箱车载电源线)

  • excel2010的主要功能包括(excel2010的主要功能)

    excel2010的主要功能包括(excel2010的主要功能)

  • 抖音聊天记录多久可以撤回(抖音聊天记录多久就查不到了)

    抖音聊天记录多久可以撤回(抖音聊天记录多久就查不到了)

  • 荣耀v30解锁方式是什么(荣耀v30手机密码忘了怎么开锁)

    荣耀v30解锁方式是什么(荣耀v30手机密码忘了怎么开锁)

  • iqoo带nfc功能吗(iqoo手机带nfc功能吗)

    iqoo带nfc功能吗(iqoo手机带nfc功能吗)

  • 手机qq昵称怎么改成彩色的(手机qq昵称怎么弄空白)

    手机qq昵称怎么改成彩色的(手机qq昵称怎么弄空白)

  • 快手视频超过10分钟怎么发(快手视频超过15分钟怎么发)

    快手视频超过10分钟怎么发(快手视频超过15分钟怎么发)

  • qqlive异地登录啥意思(qq频道异地登录)

    qqlive异地登录啥意思(qq频道异地登录)

  • 电脑进了一点水有事吗(电脑进了一点水但还能用)

    电脑进了一点水有事吗(电脑进了一点水但还能用)

  • xr开不了机(xr开不了机怎么回事)

    xr开不了机(xr开不了机怎么回事)

  • gcASNotice.exe是什么进程 有什么作用 gcASNotice进程查询(groove.exe是什么)

    gcASNotice.exe是什么进程 有什么作用 gcASNotice进程查询(groove.exe是什么)

  • Cookie 的 SameSite 属性

    Cookie 的 SameSite 属性

  • 简易征收增值税怎么做账
  • 实收资本增加的原因
  • 持有至到期投资是什么意思
  • 成本少结转了怎么调回
  • 个人住房转让纳税标准
  • 追加的固定资产当月计提折旧吗
  • 退回投标保证金分录
  • 企业清算时卖了车怎么办
  • 保证金可以抵货款吗
  • 事业单位预算外收入
  • 固定资产赔偿制度
  • 企业什么税可以退
  • 个体户上季度未申报能补报吗
  • 一般纳税人所说的税率是
  • 不动产增值税总结
  • 零申报资产总额填注册资本怎么办呢
  • 预收房屋租金如何交房产税
  • 物业公司水费差额征税不备案
  • 旅行社税收
  • 公司注销银行账户流程
  • 服务设计合同标准版
  • 出口旧设备最新政策
  • 预付款比例怎么算
  • 如何刷新手机
  • linux查杀webshell
  • 路由器怎么设置2.4g网络
  • 增值税中进项税额比对异常能作废申报吗
  • 股票的交易费用多少
  • 业务招待费汇算清缴扣除标准
  • 应交所得税和所得税费用的区别计算公式
  • 跨地区经营建筑企业预缴增值税
  • 补缴税款怎么补
  • yolov5m
  • 后端怎么把图片传给前端的
  • 启动电容坏了的表现
  • php获取当前时间戳函数
  • Joomla使用Apache重写模式的方法
  • 个人简历html网页代码含效果图
  • HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
  • transformer中的token
  • opencv官方教程
  • apt-key is deprecated
  • 提取现金准备发放工资
  • phpcms api
  • 预付装修款账务处理
  • 补收入账是什么意思
  • 哪些企业可以开13点税票
  • 汽车折旧年限是几年内的
  • MySQL主从数据库搭建
  • 土地评估增值计入什么科目
  • 其他应收款余额在贷方什么意思
  • 计提合同印花税怎么做账
  • 现金日记账的结账方法
  • 残保金用人单位在职职工人数
  • 一般纳税人怎样开3个点的专票
  • 银行存款日记账与银行对账单之间的核对属于
  • 退多收的费用计入什么科目
  • 财务费用具体包括
  • 增值税销项抵扣报税后有效期是多长时间
  • mysql数据库如何使用
  • 苹果mac最新的系统
  • xp系统1
  • macbookpro如何点击
  • linux磁盘结构
  • exgear是什么
  • linux 如何查看
  • linux的安装方法
  • opengl编程实例
  • easyui搜索框
  • javascript中的关键字有哪些
  • js判断输入用户名是否正确
  • jquery遍历li
  • 使用Raygun对Node.js应用进行错误处理的方法
  • jquery 右键菜单
  • jquery 是否显示
  • Android网络通讯哪个最简单
  • 供暖配套费
  • 企业所得税问题的研究论文
  • 江苏电子税务局网站官网
  • 医院电子发票怎么查
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设