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

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

  • 游戏试玩,守望先锋新手攻略 肉盾大锤的走位技巧(守望 游戏)

    游戏试玩,守望先锋新手攻略 肉盾大锤的走位技巧(守望 游戏)

  • 快手怎么充值(快手怎么充值推广)

    快手怎么充值(快手怎么充值推广)

  • 四核四线程和四核八线程的区别(四核四线程和四核八线程那个做软路由合适)

    四核四线程和四核八线程的区别(四核四线程和四核八线程那个做软路由合适)

  • 手机突然震动但也没有信息(手机突然震动但没消息)

    手机突然震动但也没有信息(手机突然震动但没消息)

  • 如何下载快手上的视频(如何下载快手上已付费的视频)

    如何下载快手上的视频(如何下载快手上已付费的视频)

  • 手机黑屏开不开而且闪屏(手机黑屏开不开机苹果一直闪屏)

    手机黑屏开不开而且闪屏(手机黑屏开不开机苹果一直闪屏)

  • 华为nova5pro可以升级系统10吗(华为nova5pro可以扩展内存吗)

    华为nova5pro可以升级系统10吗(华为nova5pro可以扩展内存吗)

  • vivo手机防水吗(vivo手机防水吗?)

    vivo手机防水吗(vivo手机防水吗?)

  • 为什么微信总是显示有一个新信息(为什么微信总是闪退)

    为什么微信总是显示有一个新信息(为什么微信总是闪退)

  • 抖音投放历史怎么删除(抖音投放历史怎么看)

    抖音投放历史怎么删除(抖音投放历史怎么看)

  • 闽政通手机号被注册怎么处理(闽政通手机号被注销忘了密码要怎么登记)

    闽政通手机号被注册怎么处理(闽政通手机号被注销忘了密码要怎么登记)

  • excel选项在哪(excel的excel选项在哪里)

    excel选项在哪(excel的excel选项在哪里)

  • 苹果1458是ipad几(ipad 1458是ipad几)

    苹果1458是ipad几(ipad 1458是ipad几)

  • commander是什么电脑程序(commanded什么意思)

    commander是什么电脑程序(commanded什么意思)

  • 10658102是什么服务台(10658102是什么服务)

    10658102是什么服务台(10658102是什么服务)

  • 快手推广审核多长时间(快手推广有效果审核时间长吗)

    快手推广审核多长时间(快手推广有效果审核时间长吗)

  • iphone8plus多少寸(苹果8plus几寸的)

    iphone8plus多少寸(苹果8plus几寸的)

  • realmex2pro怎么打开开发者选项(realmex2使用技巧)

    realmex2pro怎么打开开发者选项(realmex2使用技巧)

  • 快手极速版收藏怎么找(快手极速版收藏怎么不让别人看到)

    快手极速版收藏怎么找(快手极速版收藏怎么不让别人看到)

  • 三星s10e无线充电功率(三星s10e无线充电位置)

    三星s10e无线充电功率(三星s10e无线充电位置)

  • card reader什么意思(card reader是什么)

    card reader什么意思(card reader是什么)

  • vtr-al00是什么型号(vtr—al00)

    vtr-al00是什么型号(vtr—al00)

  • 小米6x无法充电(小米6x无法充电怎么回事)

    小米6x无法充电(小米6x无法充电怎么回事)

  • 重装电脑ghost分区丢失只剩C盘怎么恢复(电脑重装系统如何分区?)

    重装电脑ghost分区丢失只剩C盘怎么恢复(电脑重装系统如何分区?)

  • 纳税人期末存货怎么结转
  • 发票税率开错了怎么办
  • 缴纳的工会经费收据怎么取得
  • 外购商品捐赠进哪个科目
  • 小规模无进项怎么补税
  • 固定资产明细账需要每年更换吗
  • 境外机构可以开通b股账户
  • 冲销估价入账
  • 应付账款是负数怎么回事
  • 公司欠增值税如何补交?
  • 已开票未收款算收入吗
  • 个人增值税业务有哪些?
  • 电子增值普通发票经营范围呢免费吗
  • 开出销项负数发票怎么做账
  • 贴现率与再贴现率计算机行业是好多
  • 固定资产弃置费用预计负债
  • 保险车辆折旧的计算方法有哪些
  • 用友软件怎么反记账凭证
  • 季报企业所得税营业收入本年累计怎么填写
  • 兼职人员个税起征点
  • 用户登录系统后首先进入什么
  • windows7部分的更新安装失败怎么办?
  • php写入xml
  • 应交税金减免税款
  • 广告费和业务宣传费税前扣除基数
  • 销项负数发票应该给谁
  • PHP:pg_get_notify()的用法_PostgreSQL函数
  • 差额征收是啥意思
  • php图片叠加
  • PHP:imagescale()的用法_GD库图像处理函数
  • 保险补偿金额的计算
  • v-model的双向绑定原理
  • 小规模纳税人低于30万怎么填报申报表
  • PyTorch深度学习实战 | 基于ResNet的人脸关键点检测
  • pinf命令
  • php 7.4
  • 帝国cms功能
  • python打印矩形方阵
  • 个税少报了能查出来吗
  • rhel6安装教程
  • sqlserver2019查看表
  • 年报中的利润表本月数需要填吗
  • 外贸da付款方式的流程图
  • 个人提供劳务增值税专用发票
  • 个人所得税红利所得税率
  • 开办费用的财务是如何处理的
  • 营改增有关事项的规定
  • 虚开发票的三种情形是?
  • 预付房租摊销从哪月算起
  • 以前年度损益调整结转到本年利润吗
  • 企业信用公示的时候医疗和生育怎么分开计算
  • 处理交易性金融资产增值税买价含佣金吗
  • 中小企业抵税
  • 固定资产以前年度多计提怎么办
  • 进口葡萄酒政策
  • 无形资产的处置损益
  • 计提的工会经费年底有余额咋处理
  • 暂估应付账款借贷方向
  • 培训发票能抵扣吗
  • 小规模季报成功后怎么缴费
  • 私营公司固定资产怎么查
  • 如何利用公式计算
  • mysql连接时间长怎么优化
  • win2008r2下载
  • unix怎么切换用户
  • xp系统怎么关闭fn
  • bootstrap-Treeview实现级联勾选
  • html中的td
  • 多个版本python
  • python搜索引擎网络爬虫
  • activity间数据传递
  • linux sleep 2
  • tbc背包插件
  • jQuery Ajax使用FormData对象上传文件的方法
  • 音频基础知识及训练
  • js生成页面
  • 贸易公司税收政策
  • 税务局冬季作息时间
  • 保险免保费是什么意思
  • 建筑类的发票
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设