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

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

  • 企业为什么要选择微信营销,企业进行微信营销的误区(企业为什么要选择目标市场)

    企业为什么要选择微信营销,企业进行微信营销的误区(企业为什么要选择目标市场)

  • 怎样重装系统win10保留原文件(怎样重装系统win7)(怎样重装系统win7系统旗舰版)

    怎样重装系统win10保留原文件(怎样重装系统win7)(怎样重装系统win7系统旗舰版)

  • k40有红外遥控吗(k40有红外线遥控吗)

    k40有红外遥控吗(k40有红外线遥控吗)

  • 计算机上时钟发生装置叫什么(计算机上时钟发生装置叫什么名字)

    计算机上时钟发生装置叫什么(计算机上时钟发生装置叫什么名字)

  • potplayer是什么软件

    potplayer是什么软件

  • 荣耀magic2滑盖寿命(荣耀magic2滑盖进灰怎么清理)

    荣耀magic2滑盖寿命(荣耀magic2滑盖进灰怎么清理)

  • 华为怎么清理应用锁定(华为怎么清理应用缓存数据)

    华为怎么清理应用锁定(华为怎么清理应用缓存数据)

  • 拍鸟用什么对焦模式(拍鸟用什么对焦模式好一点)

    拍鸟用什么对焦模式(拍鸟用什么对焦模式好一点)

  • 电脑解锁后黑屏怎么办(电脑解锁后黑屏只有鼠标)

    电脑解锁后黑屏怎么办(电脑解锁后黑屏只有鼠标)

  • 微信收款二维码怎么打印(微信收款二维码怎么弄到手机桌面)

    微信收款二维码怎么打印(微信收款二维码怎么弄到手机桌面)

  • etc无法识别显示无标签

    etc无法识别显示无标签

  • q2612a硒鼓适用于什么型号的打印机(q2612硒鼓加什么粉)

    q2612a硒鼓适用于什么型号的打印机(q2612硒鼓加什么粉)

  • 抖音怎么图片评论(抖音怎么图片评论苹果)

    抖音怎么图片评论(抖音怎么图片评论苹果)

  • 手机突然卡的很是什么问题(手机突然卡的很怎么办)

    手机突然卡的很是什么问题(手机突然卡的很怎么办)

  • fn加什么键切换键盘(fn加什么键切换为正常键盘)

    fn加什么键切换键盘(fn加什么键切换为正常键盘)

  • 机器语言是面向什么的(机器语言是面向什么的语言)

    机器语言是面向什么的(机器语言是面向什么的语言)

  • 手滑关注了又取关会被发现吗(手滑关注了又取关)

    手滑关注了又取关会被发现吗(手滑关注了又取关)

  • 腾讯视频pc端怎么截屏(腾讯视频pc端怎么看登陆设备)

    腾讯视频pc端怎么截屏(腾讯视频pc端怎么看登陆设备)

  • 手机能同时登录两个微信号吗

    手机能同时登录两个微信号吗

  • ps羽化在哪找(ps里的羽化在哪)

    ps羽化在哪找(ps里的羽化在哪)

  • ps怎么改照片尺寸(ps怎么修改照片尺寸像素)

    ps怎么改照片尺寸(ps怎么修改照片尺寸像素)

  • 手机不能发短信是怎么回事(华为手机不能发短信)

    手机不能发短信是怎么回事(华为手机不能发短信)

  • 抖音怎么掩藏关注的人(抖音怎么才能隐藏自己的关注)

    抖音怎么掩藏关注的人(抖音怎么才能隐藏自己的关注)

  • ppt2010样本模板在哪(office2010样本模板在哪)

    ppt2010样本模板在哪(office2010样本模板在哪)

  • 华为畅享10plus和华为nova5i有什么区别(华为畅享10plus和10s手机壳一样吗)

    华为畅享10plus和华为nova5i有什么区别(华为畅享10plus和10s手机壳一样吗)

  • 飞猪怎么买留学生机票(飞猪机票留学生不适用)

    飞猪怎么买留学生机票(飞猪机票留学生不适用)

  • Linux为何如此深得人心呢?10项原因精选(为什么linux这么受欢迎)

    Linux为何如此深得人心呢?10项原因精选(为什么linux这么受欢迎)

  • 计提税额与实缴税额的区别是什么?
  • 一般纳税人金税盘抵税会计分录
  • 工资社保缴纳计算器
  • 固定资产进项税怎么入账
  • 收到幼儿园园服费怎么做财务处理?
  • 年初建账考虑要点有哪些
  • 公司组织旅游费用报个税吗
  • 加油发票样式图
  • 材料采购二级科目
  • 影响固定资产折旧的基本因素
  • 企业所得税弥补亏损年限
  • 单位装修质保金扣留的会计处理
  • 对方开票怎么做账务处理
  • 应付账款多计怎么处理
  • 地质灾害评估费收费标准
  • 供应商不给我们开发票,我怎么入账
  • 固定资产转到别人账户
  • 计提销项税的同类有哪些
  • 所得税会计方法有哪几种
  • 不申报税务登记被注销
  • 公司投资私募股票有哪些
  • 产权交易费用
  • 滴滴开的发票能否抵扣进项税
  • 存货盘亏损失
  • 专用发票当月认证,下月申报抵扣可以吗
  • 商铺水费收取标准2020
  • 退税收入要不要交所得税?
  • 给员工购买的意外保险可以税前扣除
  • 二手车交易税咋算
  • 工厂采购部门
  • 提坏账准备的调整分录
  • 最常用的成本核算方法表
  • 龙骨花的养殖方法移植
  • qttask.exe是什么进程?qttask.exe是不是病毒?
  • PHP aes (ecb)解密后乱码问题
  • 为什么要把收入当成舞弊假定
  • 南极岛在哪
  • 商业汇票转让后,能否追索前手
  • vue中的路由守卫有哪些
  • inotify_event
  • 为什么股本溢价
  • 科目汇总表一页不够写怎么办
  • 设备折旧费怎么使用
  • mysql union or
  • mongodb操作语句
  • SQL Server 2016 TempDb里的显著提升
  • PostgreSQL教程(七):函数和操作符详解(3)
  • 工伤保险退费了是什么意思
  • 可抵扣进项税的普通发票
  • 预期信用损失率的确认依据和过程
  • 设计费用计入什么会计科目
  • 社保阶段性减免范围
  • 自产委托加工的货物用于非增值税应税项目
  • 一般纳税人暂估入库的会计分录怎么写
  • 公允价值举例说明
  • 公司奖励给部门的奖励
  • 电子秤计入什么费用
  • 净资产增长率增长说明什么
  • 会计账簿按账页不同可以分为
  • 劳动者权益包含哪些
  • sql server如何
  • Windows 7 和 Vista 下使用 Alipay 的解决方法总结
  • centos 界面安装
  • mac idle
  • windows 10预览版
  • linux系统的服务器,重启之后运算速度变慢
  • nodejs如何使用
  • android的布局文件
  • 创业要看的书
  • shell脚本检查输入参数
  • js判断浏览器内核和版本
  • jquery插件库怎么导入
  • 如何在电子税务局添加办税人员
  • 上海个体户纳税标准
  • 公司权责清单范围
  • 印刷行业费用标准
  • 中科院有多少在校研究生
  • 车辆登记指的是什么
  • 江西公积金提取代办
  • 亏损可以结转吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设