Vue 中,computed(计算属性)和 watch(侦听器)都是用于处理数据变化的工具
一、核心区别

1CA93614-CACC-4ce7-994E-F6FEC3818636.png
二、computed 的特点与使用场景
特点:
声明式计算:以声明的方式描述一个值依赖于其他值,逻辑更清晰。
自动缓存:只有当依赖的响应式数据变化时,才会重新计算;否则直接返回缓存值。
双向绑定友好:可像普通属性一样在模板中使用,支持 v-model 双向绑定。
<template>
<div>
<input v-model="firstName" placeholder="名" />
<input v-model="lastName" placeholder="姓" />
<p>全名:{{ fullName }}</p>
<p>全名(反转):{{ reversedFullName }}</p>
</div>
</template>
<script>
export default {
data() {
return {
firstName: '',
lastName: ''
};
},
computed: {
// 基础用法:计算全名
fullName() {
console.log('计算 fullName'); // 依赖不变时不会执行
return `${this.lastName} ${this.firstName}`;
},
// 基于其他计算属性再计算
reversedFullName() {
return this.fullName.split(' ').reverse().join(' ');
}
}
};
</script>
适用场景:
数据格式化(如日期、金额格式化)
数据过滤或转换(如数组筛选)
基于多个数据计算衍生值(如购物车总价)
三、watch 的特点与使用场景
特点:
命令式监听:主动监听指定数据,当数据变化时执行自定义逻辑。
支持异步操作:适合处理数据变化后的异步任务(如接口请求)。
细粒度控制:可配置深度监听、立即执行等选项。
<template>
<div>
<input v-model="searchQuery" placeholder="搜索" />
<input v-model="userInfo.name" placeholder="用户名" />
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
userInfo: {
name: '',
age: 0
}
};
},
watch: {
// 基础用法:监听简单数据
searchQuery(newVal, oldVal) {
// 模拟搜索接口请求(异步操作)
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
console.log('搜索:', newVal);
}, 500);
},
// 监听对象属性(深度监听)
'userInfo.name'(newVal) {
console.log('用户名变化:', newVal);
},
// 完整配置写法
userInfo: {
handler(newVal) {
console.log('用户信息整体变化:', newVal);
},
deep: true, // 深度监听对象内部变化
immediate: true // 初始化时立即执行一次
}
}
};
</script>
适用场景:
数据变化后执行异步操作(如搜索联想、数据持久化)
监听复杂对象的深层变化
数据变化时需要执行批量操作或副作用(如日志记录)
四、如何选择?
优先用 computed:
当需要根据现有数据计算出新值时
当计算逻辑依赖多个数据,且需要缓存结果时
模板中需要直接使用计算结果时
优先用 watch:
当数据变化后需要执行异步操作(如接口请求)
当需要监听数据变化并执行复杂业务逻辑时
当需要深度监听对象或数组的变化时
总结
computed 是 “计算属性”,专注于数据的衍生计算,强调结果;watch 是 “侦听器”,专注于数据变化后的操作,强调过程。合理使用两者可以让代码更简洁、高效,避免不必要的性能消耗。