vue composition api 中 computed 用于封装响应式衍生状态,依赖 ref/reactive 源头数据,自动缓存更新,适用于过滤、组合等纯计算,禁用副作用,优于 methods 的重复执行。

Vue Composition API 结合 computed 处理复杂衍生状态,核心在于“用响应式数据驱动计算、用缓存避免重复开销、用结构化逻辑保持可维护性”。它不是简单拼接变量,而是把业务语义封装进一个自动更新、可复用、易测试的响应式值中。
用 ref/reactive 定义源头状态
计算属性必须依赖响应式数据才能触发更新。先明确哪些是原始输入:
- 基本类型(字符串、数字、布尔)用
ref,访问和修改都通过.value - 对象或数组用
reactive,直接操作属性,无需解包 - 避免把普通 JS 变量(如
const count = 0)传给computed,否则不会响应变化
例如用户筛选场景:
const searchKeyword = ref('')const userList = reactive([{ id: 1, name: 'Alice', active: true }, { id: 2, name: 'Bob', active: false }])
用 computed 封装派生逻辑
computed 接收一个 getter 函数,返回一个只读的响应式 ref。它会在依赖项变化时自动重算,并缓存结果直到下一次变化。
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
- 适合做过滤、格式化、组合、条件判断等纯函数式操作
- 不要在
computed中执行副作用(如发请求、改 DOM、调用console.log),它只负责“算出值” - 如果需要双向绑定(比如表单联动),可用带
get和set的对象形式
继续上面的例子:
const filteredUsers = computed(() =>userList.filter(u => u.name.toLowerCase().includes(searchKeyword.value.toLowerCase()))
)
处理嵌套或异步依赖的衍生状态
当衍生状态涉及多个层级或需等待异步结果时,computed 本身不支持 await,但可以配合 ref + watch 或封装为自定义 Hook:
- 若依赖的是 Promise 状态(如
loading、data、error),可定义一个computed判断当前视图应显示什么(如isLoading ? '加载中' : data?.length ? '有数据' : '暂无内容') - 若需基于异步结果再计算(如“已选中用户的平均年龄”),确保该结果本身是响应式的(如用
ref(null)存储并 watch 更新) - 复杂逻辑建议抽离为独立函数,再在
computed中调用,提升可读性和单元测试能力
与 methods 对比:什么时候该用 computed?
关键看是否满足两个条件:值由响应式数据决定 + 需要多次读取且希望避免重复执行。
- ✅ 适合:
{{ totalPrice }}(价格 = 单价 × 数量 × 折扣)、{{ canSubmit }}(所有必填字段非空且校验通过) - ❌ 不适合:
{{ formatDate(new Date()) }}(每次渲染都生成新时间,无依赖)、{{ handleClick() }}(含副作用,应放 methods) - ⚠️ 注意:模板中直接调用方法会失去缓存,频繁触发可能影响性能;而
computed在依赖不变时始终返回同一引用,对v-if、v-for渲染优化明显
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!









