Vue计算属性的核心价值是响应式依赖与自动缓存,包含函数式(最常用)、对象式(支持读写)和组合式API中computed()三种正确写法,而methods调用、watch模拟或mounted一次性赋值均属伪计算属性,应避免。

Vue 计算属性的核心价值在于响应式依赖 + 自动缓存,但实现方式不止一种。不同写法适用于不同场景,选错容易带来性能浪费或逻辑错误。
基础函数式写法(最常用)
直接在 computed 对象中定义返回值的函数,适合纯派生、无副作用的同步计算。
- 依赖响应式数据自动追踪,如
firstName和lastName变化时,fullName立即更新 - 模板中使用无需括号:
{{ fullName }},语义清晰,像普通属性一样调用 - 多次访问不重复执行,比如在模板里用了三次,只计算一次并复用结果
对象式写法(支持读写)
传入含 get 和 set 的对象,实现“可写计算属性”,常用于双向绑定反向解析。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
-
get()负责读取逻辑,和函数式写法行为一致 -
set(value)在赋值时触发,比如用户在<input v-model="fullName">中输入,可拆解并同步更新firstName和lastName - 注意:不能在
set中修改非响应式原始值,必须作用于ref或reactive数据
组合式 API 中的 computed() 函数
Vue 3 推荐方式,配合 ref 或 reactive 使用,类型更明确、逻辑更内聚。
立即学习“前端免费学习笔记(深入)”;
- 返回的是一个
Ref,需通过.value访问(但在模板中自动解包,仍写{{ count }}) - 支持泛型标注类型,便于 TypeScript 工程维护
- 可与其他组合式逻辑(如
watch、onMounted)自然共存,避免选项式 API 的分散感
不推荐的“伪计算属性”写法
有些做法看似类似,实则失去缓存与响应式优势,应避免。
- 在
methods中写相同逻辑并模板调用{{ getFullName() }}:每次渲染都执行,无缓存,性能差 - 用
watch手动更新一个data字段模拟计算:绕过 Vue 响应式系统,易遗漏依赖、难以调试 - 在
mounted中一次性计算并赋值:无法响应后续数据变化,彻底失去“响应式”意义

















