计算属性在模板中直接用{{ fullName }}插值,无需加括号或.value;适合拼接、过滤统计、多级推导等派生场景,且自动缓存、高效复用,但必须是纯函数,不可含副作用或异步操作。

直接在模板中用双大括号 {{ }} 插值即可,不需要额外调用或加括号,Vue 会自动响应依赖变化并更新显示。
计算属性在模板中的基本写法
定义好的计算属性(比如 fullName、totalPrice)和普通响应式变量一样,直接写在模板里:
- ✅ 正确:
{{ fullName }}、{{ totalPrice }} - ❌ 错误:
{{ fullName() }}(不是方法,不能加括号) - ❌ 错误:
{{ fullName.value }}(Composition API 中虽内部是 ref,但模板中自动解包,无需手动取 .value)
适合模板展示的典型复杂派生场景
计算属性特别适合把逻辑从模板中抽离出来,让模板干净、可读、可复用:
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
-
拼接与格式化:如
fullName = computed(() => `${firstName.value} ${lastName.value}`),模板中只写{{ fullName }} -
条件过滤+统计:如购物车中“已选商品总价”,模板中写
{{ totalPrice }},背后是cart.value.filter(...).reduce(...) -
多级状态推导:例如用户等级 + 折扣规则 → 实际折扣率,模板中只需
{{ finalDiscountRate }},逻辑全在 computed 函数内
多次使用也不重复计算
同一个计算属性在模板中出现多次,只要依赖没变,就只执行一次函数、返回一次缓存结果:
立即学习“前端免费学习笔记(深入)”;
- 比如模板里同时有
{{ totalPrice }}和总价:{{ totalPrice }} 元,Vue 内部只会算一遍 - 这比写成方法(
methods: { getTotal() { ... } })更高效——方法每次渲染都执行,无缓存
注意:不能在模板中做副作用或异步操作
计算属性函数必须是纯函数(无副作用、不修改响应式数据、不发请求、不 setTimeout):
- ✅ 可以:
computed(() => list.value.length > 0 ? '有数据' : '空') - ❌ 不行:
computed(() => { api.get().then(...); return 'loading'; })—— 应该用watch或async/await + ref管理异步状态

















