计算属性 computed 是 vue 中处理派生数据最自然的方式,它将模板中冗长、重复、带逻辑的表达式抽离为可复用、可测试、响应式的函数,使模板专注展示。

计算属性 computed 是 Vue 中处理派生数据最自然的方式——它把模板里冗长、重复、带逻辑的表达式,抽离成可复用、可测试、响应式的函数,让模板回归“只负责展示”的本职。
用 computed 替代模板中的复杂表达式
模板里写 {{ user.firstName + ' ' + user.lastName | capitalize }} 看似简单,但一旦涉及条件拼接、空值判断或格式转换,就会迅速变得难读难维护。换成计算属性后,逻辑集中、命名清晰:
- 把字符串拼接、过滤、排序等操作移出模板,放进
computed选项 - 函数名即语义,比如
fullName、filteredPosts、isFormValid - 模板中直接写
{{ fullName }},干净直观,无需关心实现细节
避免 methods 的重复执行和响应性缺失
有人习惯在模板中调用方法(如 {{ getFullName() }}),但这有两大问题:每次渲染都重新执行,且无法自动追踪依赖变化。而 computed 会缓存结果,仅在依赖响应式数据变化时才重新求值:
-
methods每次触发都执行,哪怕参数没变;computed有响应式缓存机制 - 如果
getFullName()依赖user.name,它不会自动更新;fullName计算属性会 - 尤其适合处理数组过滤、对象深拷贝前的结构转换等开销稍大的操作
组合多个响应式状态,生成新状态
当需要根据多个响应式字段动态决定某个 UI 状态时(比如按钮是否禁用、标签颜色、提示文案),computed 是最佳选择:
- 例如:
canSubmit同时依赖form.email、form.password和termsAccepted - 所有依赖变更时,
canSubmit自动更新,无需手动 watch 或事件监听 - 相比
watch,它更声明式、无副作用,更适合纯派生逻辑
配合 setter 实现双向派生(进阶用法)
默认 computed 是只读的,但你可以显式定义 set,让计算属性支持赋值——适用于需要解构/映射输入的场景:
- 比如把
fullName映射回firstName和lastName,用户修改全名时自动拆分 - set 函数接收新值,内部更新底层数据,保持响应式链条完整
- 注意:setter 不应有副作用,只用于同步更新源数据
不复杂但容易忽略:computed 的函数体里,只做同步计算,不要发请求、改 DOM、调用非响应式 API——它不是用来替代 watch 或 mounted 的。











