Vue.js 的 computed 计算属性和 watch 侦听器的区别在哪里?

1,947 阅读3分钟

为什么写这篇笔记?

记得在以往的面试中多次被问到这个问题,回答的都不理想,仔细想想也是理解的不到位。今天借着休息的时间准备查阅文档,写写示例代码去仔细理解下。

computed 计算属性是什么?

computed 计算属性介绍:

computed 计算属性是一个对象。它的使用方法是在 computed 属性中定义一个方法,和给对象定义方法一样,方法名可以直接在页面(template)中使用,不需要加 (),这是因为计算属性看起来是指向了方法(function),其实指向的是方法 return 的结果。
computed 计算属性的特性是计算结果会被缓存,如果 function 中依赖的响应式属性发生变化,computed 便会重新计算。注意如果依赖实例之外的属性(比如非响应式属性)则计算结果不会更新。 此外,如果在计算属性中使用了箭头函数,则 this 不会指向组件的实例,但在函数中依然可以将实例以函数的第一个参数访问。如下:

computed: {
	aDouble: vm => vm.a * 2
}

此外,计算属性默认只有 getter ,但也可以使用 setter 。 具体操作示例请看 计算属性的 getter 和 setter

计算属性使用示例:

computed: {
	newList: function() {
    	return this.brandList.filter(item => item.name.indexOf(this.keywords) !== -1);
    }
 }

什么时候使用计算属性?

模板内表达式多用于简单计算,这样便于阅读代码时的理解。如果在模板表达式里使用复杂的运算,一是难以理解,二是不能复用。你可能会说,那我在 methods 中定义一个方法, return 处理结果也可以啊。是的,可以。但不同之处在于,计算属性会缓存计算结果,只在依赖的响应式属性发生变化时,才会更新数据。这是计算属性的性能优势。 更多详情可访问

Vue 之 computed 属性

watch 侦听器是什么?

watch 侦听器介绍

watch 属性是一个对象,键(key)可以是 Vue 实例的表达式(字面量)和字符串(data 中定义的数据),值是回调函数,也可以是方法名、包含了方法的对象和方法集合的数组。 回调函数的参数包含了新值和旧值。同时,如果需要对对象的值做进一步侦听,需要将键(key)对应的值设为对象,在对象的身上定义回调函数,再设置 deep 属性为 true。同时如果设置 immediate: true,则回调会在侦听开始之前调用。 需要注意的是 watcher 函数不能是箭头函数,官网的解释是箭头函数绑定了父级作用域上下文,会使 this 不能按照期望指向 Vue 实例。

什么时候使用侦听器?

当需要在数据变化时做异步或者开销比较大的操作时,watch 比较有用。

详细介绍可以访问 Vue 官网查看 watch 属性介绍。

Vue 之 watch 属性

总结:computed 计算属性和 watch 侦听器的区别

相同点

都是在数据发生变化需要进行处理的时候使用。

不同点

  • 使用方式上 计算属性是依据响应式属性得出的计算属性,使用时需要调用,且不加(),会缓存数据,在响应式属性更新时,计算属性也更新。 侦听器不需要调用,会在侦听属性发生变化时,自动调用。 注意,计算属性必须 return 一个结果,也就是处理后的计算属性的值。而侦听器则不需要。
  • 使用场景上 计算属性多用于依据一个或多个响应式属性得到另一个计算属性。比如:姓+名=全名。比如购物车结算金额时。 侦听器多用于复杂场景或需要异步操作时,比如搜索时实时出现搜索建议或提示。搜索场景代码示例可访问 Vue 之 侦听器