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

这篇具有很好参考价值的文章主要介绍了vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

reactive调用createReactiveObject,并把mutableHandlers传入了参数
vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析

createReactiveObject使用了proxy,把mutableHandlers作为proxy的handler
vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析

然后我们看看handler是怎么做的vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析
vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析

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

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

然后就会去调用triggerEffect(说实话,我还没看到为啥355和360行的代码要这样写),这里如果有scheduler就会去执行,这里的scheduler是构造函数的第二个参数vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析

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

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

回到文档vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析

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

有不懂欢迎评论,一起探讨文章来源地址https://www.toymoban.com/news/detail-456658.html

到了这里,关于vue 计算属性未重新计算 / computed 未触发 / computed 原理&源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue-计算属性(computed)简单说明和使用

    学习vue的计算属性之前,我们先写一个案例,我们先用插值语法实现,然后再使用vue的计算属性实现,经过对比,我们就能掌握计算属性的精髓和原理 写一个简单的例子,姓和名分别用两个输入框控制,最后通过一个span标签拼接成一个全名 首先通过简单的插值语法实现,需

    2024年01月16日
    浏览(50)
  • Vue3/ Vue3 计算属性computed函数 语法 与 介绍 、Vue3 Vue2computed计算属性 能不能传参 怎么传参

    语法: // 第一种语法get方法 (没有set) const 函数名 = computed(() = {   return  }) // 第二种语法 get set 方法 带有set参数 可以设置 const 函数名 = computed(() = { get() { return 结果 }, set( val ){  } }) 触发场景:  如果要访问计算属性 会自动执行 get 如果要修改计算属性 会自动执行 set 简介

    2024年02月02日
    浏览(51)
  • vue3-computed计算属性!!!

    1.计算属性具有缓存特性,在computed中的响应式数据不发生变化时,就不重新加载computed中的逻辑。(作用于大量耗时的逻辑解构,并为其数据不经常发生变化,可采取computed计算属性提高程序效率--常用于购物车数据计算) 代码如下:  通过F12检测数据变化:

    2024年02月05日
    浏览(49)
  • vue全家桶进阶之路33:Vue3 计算属性computed

    在Vue3中,计算属性可以使用 computed 函数来定义。 computed 函数接受两个参数:第一个参数是一个函数,该函数返回计算属性的值;第二个参数是一个可选的配置对象,可以包含getter和setter函数,以及控制计算属性缓存的缓存配置。 Vue3中的计算属性与Vue2中的计算属性相比有以

    2023年04月18日
    浏览(46)
  • Vue3前端开发,computed计算属性的基础练习

    Vue3前端开发,computed计算属性的基础练习! 在新版里面,和传统的vue2一样,计算属性,都是对一些数据运算进行了封装操作。返回结果是一个实时监控的效果。区别在于,写法不同。效果是一样。 下面给大家展示一个简单的案例。 如图,自定义一个组件,ComputedDemo.vue。里

    2024年01月18日
    浏览(50)
  • Vue3的computed计算属性和watch监视(四)

    监视【ref】定义的【基本数据】类型 监视【ref】定义的【对象类型】数据 监视【reactive】定义的【对象类型】数据  与 场景二 不同的是,newVal和oldVal是一样的,表明通过Object.assign重新赋值的时候,并不是生成一个新的对象,而是新的值覆盖了旧值 监视【ref】或者【reactiv

    2024年02月21日
    浏览(45)
  • 【vue2】计算属性(computed)与侦听器(watch)详解

    🥳博       主: 初映CY的前说(前端领域) 🌞个人信条: 想要变成得到,中间还有做到! 🤘本文核心: 计算属性与侦听属性的用法 目录( 文末有给大家准备好的Xmind思维导图 ) 一、计算属性computed ①默认get()方法,仅是获取值 ②不仅仅是获取值,还具有修改属性功能

    2024年01月16日
    浏览(52)
  • 前端Vue入门-day02-vue指令、computed计算属性与watch侦听器

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 指令补充 指令修饰符 v-bind 对于样式控制的增强  操作class 案例:京东秒杀 tab 导航高亮 操作style  v-model 应用于其他表单元素  computed 计算属性 基础语法 computed 计算属

    2024年02月11日
    浏览(44)
  • Vue3 计算属性和侦听器实战(computed、watch)——简易点餐页面

    这篇文章记录一下 Vue3 计算属性和侦听器 (computed、watch) 实战的内容,这篇文章我们在有计算属性和侦听器的基础上,我们来制作一个简易点餐页面,接下来我们一起来从零到一开始制作。 计算属性和侦听器相关文章推荐: 深入与浅谈 Vue 中计算属性和侦听器的区别和使用

    2024年02月09日
    浏览(99)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包