Vue 中的计算属性 (computed) 与侦听器 (watch) 对比

在 Vue 中,computed 适用于依赖多个数据计算出带缓存的属性值(必须有返回值,默认仅有 getter,可自定义 setter,不支持异步,初始化时会执行一次),而 watch 适用于监听数据变化并执行回调(支持异步,可通过 immediate: true 初始化执行,无缓存,回调接收新值和旧值),前者侧重数据派生,后者侧重变化响应。

1、简介

在 Vue 中,computedwatch 都可以基于数据变化做处理,但应用场景和机制有所不同。

  • 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 偏向于事件响应。

推荐阅读
cjavapy编程之路首页