Vue.js计算属性computed依赖追踪与副作用函数effect关联机制

计算属性是基于惰性effect的缓存型响应式机制:首次访问时执行getter并收集依赖,后续依赖未变则返回缓存值;依赖变化时仅标记dirty,下次读取才重算并更新依赖关系,支持动态精确收集与多级响应链接。Vue.js 的计算属性(computed)能自动响应依赖数据变化并缓存结果,其底层核心正是依赖追踪与副作用函数(effect)的联动机制。这不是简单的"监听+执行",而是一套精细的响应式调度系统:当计算属性被访问时,它会主动"注册"自己所用到的响应式数据为依赖;当这些数据变化时,再触发对应计算逻辑的重新求值。计算属性本质是一个带缓存的响应式 effectVue 中的 computed 并非独立于响应式系统之外,而是基于 effect 构建的封装。它内部会创建一个惰性(lazy)的副作用函数,并设置 dirty = true 标志。首次读取时才执行该 effect 得到值,同时收集依赖;后续读取若依赖未变,直接返回缓存值(value),跳过重新执行。每个 computed 实例都持有一个私有 effect,该 effect 的 runner 就是计算函数本身这个 effect 被标记为 lazy: true 和 computed: true,使其不立即执行,也不参与普通响应式更新队列依赖的响应式属性(如 ref 或 reactive 中的字段)在 getter 执行过程中,通过 track() 记录当前 activeEffect(即该 computed effect)为其依赖依赖收集发生在 getter 执行时当你在 computed(() => obj.count + 1) 中访问 obj.count,其 get trap 会检测到当前存在活跃的 effect(即该 computed 的 runner),于是调用 track(obj, 'count', activeEffect),把该 effect 加入 obj.count 对应的依赖集合(depsMap)中。依赖收集是"被动触发"的:只有真正读取响应式属性,才会建立连接若计算属性中存在条件分支(如 v ? a : b),只有实际执行到的分支路径上的响应式读取才会被收集这意味着依赖关系是动态、精确的------不会因代码存在而收集,只因运行时执行而收集响应式更新触发 dirty 置位与懒执行当某个被依赖的响应式属性(如 obj.count)被修改,其 set trap 会调用 trigger(obj, 'count'),遍历所有依赖该 key 的 effects 并执行它们的 scheduler(如果存在)。对于 computed effect,scheduler 的默认行为是将自身标记为 dirty = true,而不是立刻重算。 Ideogram Ideogram是一个全新的文本转图像AI绘画生成平台,擅长于生成带有文本的图像,如LOGO上的字母、数字等。

相关推荐
2301_781571427 分钟前
mysql数据库响应缓慢如何排查_使用EXPLAIN分析执行计划
jvm·数据库·python
彳亍10123 分钟前
实现倒计时数字在到达1后自动隐藏(2为最后可见数字),同时继续运行至-1再终止
jvm·数据库·python
Hical_W41 分钟前
Hical 踩坑实录五部曲(五):Boost.MySQL 协程集成的 5 个坑
数据库·mysql·开源
X566143 分钟前
CSS如何处理SSR中CSS引入_在服务端渲染时提取关键CSS
jvm·数据库·python
哆哆啦001 小时前
使用 Obsidian + GitHub Actions + GitHub Pages 搭建内容发布流
数据库·笔记·github·obsidian
duke8692672141 小时前
PostgreSQL 中高效插入多对多关联数据的三种方案对比与最佳实践
jvm·数据库·python
迷枫7121 小时前
达梦数据库备份还原:物理备份、逻辑备份
数据库
czlczl200209251 小时前
mysql表复制方案
数据库·mysql
狮子座明仔2 小时前
AgentSPEX:当 Agent 框架开始把“控制流“从 Python 里抠出来
开发语言·python
m0_463672202 小时前
mysql数据库如何进行逻辑备份与物理备份对比_优缺点分析
jvm·数据库·python