1、简介
在 Vue 中,computed
和 watch
都可以基于数据变化做处理,但应用场景和机制有所不同。
computed(计算属性)
用于根据现有的响应式数据,动态计算出一个新的属性值,并且具有缓存功能。watch(侦听器)
用于监听现有响应式数据的变化,并在变化发生时执行特定操作(可异步)。
2、主要区别对比
对比项 | computed(计算属性) | watch(侦听器) |
---|---|---|
用途 | 适合根据多个数据属性计算出一个复杂的新值 | 适合在数据变化时执行逻辑(包括异步任务) |
返回值 | 必须有返回值(getter) | 无需返回值 |
执行时机 | 仅当依赖的响应式数据变化时才重新计算 | 每当监听的数据变化时立即执行回调 |
缓存 | 有缓存,依赖不变时多次访问不会重复计算 | 无缓存,每次变化都会执行 |
异步支持 | 不支持异步 | 支持异步操作 |
初始化执行 | 初始化时会计算一次 | 默认不执行(可通过 immediate: true 让其初始化执行) |
Setter | 默认只有 getter;可自定义 setter 以支持赋值 | 不涉及赋值 |
适用场景 | 多个数据影响一个结果 | 一个数据变化影响多个结果 |
回调参数 | 无直接参数 | 有两个参数:新值(newValue)、旧值(oldValue) |
3、使用示例
1)computed 示例
export default {
data() {
return {
firstName: 'John',
lastName: 'Doe'
}
},
computed: {
fullName: {
get() {
return`${this.firstName} ${this.lastName}`;
},
set(value) {
const parts = value.split(' ');
this.firstName = parts[0];
this.lastName = parts[1];
}
}
}
}
2)watch 示例
export default {
data() {
return {
searchText: ''
}
},
watch: {
searchText: {
handler(newVal, oldVal) {
console.log(`搜索内容从 ${oldVal} 变为 ${newVal}`);
this.fetchData(newVal);
},
immediate: true// 初始化时执行一次
}
},
methods: {
fetchData(query) {
// 模拟异步请求setTimeout(() => {
console.log(`请求数据:${query}`);
}, 500);
}
}
}
4、总结
1)当需要依赖多个数据计算一个值时,使用 computed
。
2)当需要监听数据变化并触发逻辑(尤其是异步操作)时,使用 watch
。
3)computed
偏向于数据派生,watch
偏向于事件响应。