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

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

  • 华为hry-al00t是华为什么型号的手机

    华为hry-al00t是华为什么型号的手机

  • opporeno特殊功能(oppo reno功能)

    opporeno特殊功能(oppo reno功能)

  • yy地域限制不能语音(yy有地域限制吗)

    yy地域限制不能语音(yy有地域限制吗)

  • win7ghost后无法引导(装完win7系统无法引导)

    win7ghost后无法引导(装完win7系统无法引导)

  • 办手机卡要多少岁(办手机卡要多少钱一张联通)

    办手机卡要多少岁(办手机卡要多少钱一张联通)

  • 哔哩哔哩和抖音区别(哔哩哔哩和抖音哪个早)

    哔哩哔哩和抖音区别(哔哩哔哩和抖音哪个早)

  • 苹果外包装序列号在哪(苹果外包装序列号未激活)

    苹果外包装序列号在哪(苹果外包装序列号未激活)

  • 漫步者tws2和tws3区别(漫步者tws2和tws2plus的区别)

    漫步者tws2和tws3区别(漫步者tws2和tws2plus的区别)

  • 什么是5G消息(5g消息是什么业务收费吗)

    什么是5G消息(5g消息是什么业务收费吗)

  • ai相机什么意思(ai相机是指什么)

    ai相机什么意思(ai相机是指什么)

  • 微信怎么找以前的朋友圈(微信怎么找以前加过的好友)

    微信怎么找以前的朋友圈(微信怎么找以前加过的好友)

  • 荣耀20pro与nova5pro的区别(荣耀20pro与nova5pro游戏哪个好)

    荣耀20pro与nova5pro的区别(荣耀20pro与nova5pro游戏哪个好)

  • 打印机不用时要关机吗(打印机不用时要拔插座吗)

    打印机不用时要关机吗(打印机不用时要拔插座吗)

  • 荣耀v30和华为mate30区别(荣耀v30和华为mate30)

    荣耀v30和华为mate30区别(荣耀v30和华为mate30)

  • 为什么一个路由器有两个wifi信号(为什么一个路由器有网另一个没有)

    为什么一个路由器有两个wifi信号(为什么一个路由器有网另一个没有)

  • opporeno录屏怎么没有声音(opporeno录屏怎么去掉小白点)

    opporeno录屏怎么没有声音(opporeno录屏怎么去掉小白点)

  • vivox23进水怎么办(vivox23进水了)

    vivox23进水怎么办(vivox23进水了)

  • windows怎么关闭杀毒(windows怎么关闭更新)

    windows怎么关闭杀毒(windows怎么关闭更新)

  • 奥维地图怎么使用教程(奥维地图怎么使用经纬度导航)

    奥维地图怎么使用教程(奥维地图怎么使用经纬度导航)

  • 手机ip和手机号有关吗(手机的ip 是跟手机号有关还是跟地域有关)

    手机ip和手机号有关吗(手机的ip 是跟手机号有关还是跟地域有关)

  • 小红书怎么找商品链接(小红书怎么找商务合作)

    小红书怎么找商品链接(小红书怎么找商务合作)

  • 如何查看电脑主板型号(如何查看电脑主机名)

    如何查看电脑主板型号(如何查看电脑主机名)

  • 5v1a和5v2a可以通用吗(5v1a和5v2a5v3a可以通用吗)

    5v1a和5v2a可以通用吗(5v1a和5v2a5v3a可以通用吗)

  • 360手机智能聚合页怎么去掉(360手机智能聚合怎么关闭)

    360手机智能聚合页怎么去掉(360手机智能聚合怎么关闭)

  • iphone5s怎么截屏长图(iphone5s截屏)

    iphone5s怎么截屏长图(iphone5s截屏)

  • 趣步手环任务怎么做(趣步手环卷轴任务怎么开启)

    趣步手环任务怎么做(趣步手环卷轴任务怎么开启)

  • 钉钉虚拟定位会被发现吗(钉钉虚拟定位会被管理员看出来真实位置吗)

    钉钉虚拟定位会被发现吗(钉钉虚拟定位会被管理员看出来真实位置吗)

  • Vue--》探索Pinia:Vue状态管理的未来(vue .find)

    Vue--》探索Pinia:Vue状态管理的未来(vue .find)

  • 如何将web前端连接数据库(web前后端连接)

    如何将web前端连接数据库(web前后端连接)

  • 农村合作社怎么挣钱
  • 企业所得税弥补亏损明细表怎么填写
  • 销售并提供安装的税率
  • 递延收益属于利息收入吗
  • 小规模发票冲红怎么申报
  • 工商银行资产负债表
  • 资产损失申报扣除
  • 旧设备变现损失抵减所得税怎么算
  • 取得虚开增值税专用发票罪量刑标准
  • 代账报税软件哪个好
  • 合伙企业购买股票产生的收益需要缴纳税款吗
  • 附加税是当月计提当月缴纳吗
  • 刚升级一般纳税人可以申请贷款吗
  • 该纳税人无发票相关信息
  • 增值税进项税额转出的账务处理
  • 资源税如何进行账务处理
  • 国内外经典案例
  • 律师事务所的会计账务处理
  • 农贸市场收取管理费
  • 托收承付结算方式
  • 减免税款未抵扣增值税
  • 小企业成本核算方法移动加权平均法
  • steam打开速度
  • 长期待摊费用期末在借方还是贷方
  • 盘活存量国有资产与轻资产运营
  • 公司长期贷款
  • 累计带薪缺勤的核算和计量
  • 关闭系统的命令位于什么菜单中
  • 交易性金融资产属于什么科目
  • 银行提取现金会计等式
  • 完工产品成本的直接材料怎么算
  • 如何选购餐桌椅
  • php 函数返回值
  • 为什么结转各项支出时本年利润在借方
  • 季度利润表中的营业收入怎么算
  • 会计开税票的表格范本
  • 申报表已申报未交款后作废
  • js查找数组所有符合条件数据
  • 购买银行承兑汇票怎么做账
  • 合同发票收款付款管理系统源码
  • 充油卡 发票
  • phpcms插件
  • 接待客户的住宿费计入什么科目
  • 销售额包括哪些会计科目
  • 如何进行工程项目的经济评价
  • 公司注销后实收资本要交税吗
  • 市政绿化工程的施工方案
  • 申请个税退税账号是什么
  • 五险一金会计科目分录
  • 会计凭证的粘贴顺序
  • 建账的基本要求
  • sql查询从入门到实践
  • 如何创建桌面快捷方式电脑
  • tcpsyncookies
  • ubuntu启动vncserver
  • wbs是什么的缩写
  • win8.1一直开机,无法进入主界面
  • 微软被告
  • win8切换到桌面的快捷键
  • win8系统ie浏览器最高多少
  • win7双击有声音
  • windows.prompt用法
  • 博主是re_mini_scene
  • [置顶] 关于在vs2013中配置opengl红宝书第八版环境
  • 安卓笔记软件squid使用教程
  • 浏览器隐藏用法
  • cocos 3.x android下home键后,切回游戏时黑屏太久的问题
  • flash 3 utility
  • Vuforia ImageTarget Native版本编译
  • python中while用法
  • [置顶]电影名字《收件人不详》
  • jquery和angularjs的区别
  • js数组的push方法
  • jquery formbuilder
  • 山东税务局电子税务局申报
  • 小规模纳税人忘记作废发票导致超过免税范围
  • 深圳税务局工作时间表
  • 三证合一后还要做什么
  • 山东省工会经费收支管理办法
  • 广西定额发票查询入口官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设