位置: 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 移动端)

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

  • 金融资产交易增值税
  • 企业所得税退税的会计分录怎么做
  • 资管产品增值税由谁承担
  • 税收负担影响企业的利润吗
  • 什么是存货周转率?存货周转率的意义是什么
  • 计提无形资产摊销额计入什么科目
  • 个税系统里的免税收入在哪删除
  • 公司会计日常工作内容
  • 烟叶税税率计算方法
  • 公司优秀党员事迹材料
  • 员工出差自驾怎么看待
  • 装水表财务是什么费用
  • 电子税务局在哪里看财务报表
  • 减半征收企业所得税的项目有哪些?
  • 弥补以前年度亏损从哪里取数
  • 已经认证的发票红冲发票需要收回原发票吗
  • 基本医疗支付范围
  • 建筑施工企业质量体系环境包括
  • 资产减值损失结转
  • 企业咨询评估
  • 压覆矿产赔偿标准法律依据
  • 计提房屋租赁费
  • 个人开劳务发票要同时交个税吗?
  • 二房东税务局开发票
  • 未达起征点销售额,11栏怎么填写
  • 减税必须通过开户银行吗
  • 有进项税额转出怎么结转增值税
  • 应收账款出售给银行
  • 有产能无产量
  • 国际货运运费的计算基础
  • 企业收到保险公司的赔款
  • 资产减值损失汇算清缴需要调增嘛?
  • 房产产权置换
  • 栀子花的养殖方法和注意事项茉莉花
  • 领料单出库单区别
  • 预付工程施工款会计分录
  • electron 打包
  • 红字专用发票开具的规定
  • Vision Transformer 模型详解
  • 微信公众号服务平台
  • 计算机领域划分
  • php处理并发有哪些技术
  • 物业管理公司经营范围有哪些内容
  • 企业给企业借款收入会计处理
  • 增值税专用发票几个点
  • 2.MyBatis
  • db2入门视频教程
  • MongoDB的Master-Slave主从模式配置及主从复制要点解析
  • mongodb的安装过程和操作命令
  • 可以采用
  • 无形资产摊销是按原值吗
  • 支付给职工以及为职工支付的现金增加说明什么
  • 会计人要求
  • 作废的现金支票可以直接碎掉吗
  • 福利部门的福利有哪些
  • 不是企业职工能否挂靠企业交社保
  • 预借差旅费的借贷方
  • 生产企业消防设施管理规定
  • 生育津贴案件
  • 固定资产盘点表excel
  • 企业在计划内应生产的工业产品
  • sql server执行语句
  • 怎么提升命令提示符
  • win7修改sid
  • linux命令telnet
  • mcupdate.dll
  • win7系统关机很慢什么原因
  • 十个常用linux脚本命令
  • linuxwho
  • 安卓微信5.0版本下载
  • unity系统错误
  • js的事件绑定
  • jquery滑动效果
  • js闭包作用问题解决应用
  • javascript标签大全
  • javascript 数组删除
  • 国家税务总局广州市税务局
  • 微众银行企业金融客服电话多少
  • 河北省电子税务局手机登录入口
  • 深圳交警的微博
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设