计算属性性能更优,因其具备依赖收集、结果缓存和懒执行机制;方法每次调用都重新执行,无缓存与依赖追踪。

计算属性比普通方法更省性能,核心在于它自带智能缓存机制,而方法每次调用都重新执行——哪怕依赖数据根本没变。
依赖收集:Vue悄悄记下“谁用了谁”
定义 computed 时,Vue 会立即运行一次它的 getter 函数,并在执行过程中监听所有读取的响应式数据(比如 ref 或 reactive 中的字段)。这些被读取的数据会被自动记录为该计算属性的“依赖”。这个过程不靠人工声明,完全由 Vue 的响应式系统自动完成。
- 例如:
fullName里用了firstName.value和lastName.value,Vue 就把这两个 ref 记为它的依赖 - 只要没访问过,就不会触发依赖收集;首次访问才启动,所以是懒执行
结果缓存:算过一次,就存起来备用
第一次计算完成后,结果不是丢掉,而是被 Vue 存进内部缓存池。之后无论模板里引用多少次、组件内访问多少遍,只要依赖没变,就直接返回缓存值,跳过整个函数执行过程。
- 模板中写十次
{{ fullName }},getter 只运行一次 - 组件 JS 里连续读
fullName.value五次,也只取缓存,不重算
缓存失效与更新:只在真正需要时才动
当某个依赖项(如 firstName.value)被修改,Vue 会标记这个 computed 为“脏”(dirty),但不会立刻重算。等到下一次访问它时,才触发重新执行 getter、更新缓存、并通知视图更新。
- 这种“延迟更新”避免了在一次状态批量变更中反复计算
- 和 methods 对比:哪怕
firstName没改,getFullName()在每次渲染中仍会被调用多次
和普通方法的关键差异对比
方法没有依赖追踪,也不缓存结果。它就像一个纯函数调用,每次 render、每次绑定、每次 JS 访问,都会走一遍完整逻辑:
- methods 不知道谁变了、谁没变,只能无脑执行
- computed 知道自己靠什么活着,只在“靠山动摇”时才出手
- 复杂格式化、多条件判断、数组过滤等场景,性能差距会非常明显



















