Vue 的 watch 和 computed 有什么不同

Vue 的 watch 和 computed 有什么不同

这是一个老生常谈的话题,两个选项实现的功能非常的类似,但实现原理和应用场景上有些不同

从文档/定义分析

从文档上看,这两个东西是有本质的区别的,一个叫“计算属性”,另一个叫“侦听属性”
他们可以公用类型 { [key: string]: function } 但是各自有区别

计算属性 computed

类型:{ [key: string]: Function | { get: Function, set: Function } }
对比下面的 watch 可以看出,在类型上 watch 的 key 可以是字符串、函数、对象等,而 computed 只能是 function,并且里面可以使用 get 和 set 方法
它的定义是,计算属性将会被混入 Vue 实例中。所有的 getter 和 setter 的 this 上下文自动 绑定为 Vue 实例
计算属性的结果会被缓存,依赖响应式对的 property 变化触发重新计算

侦听属性 watch

类型:{ [key: string]: string | Function | Object | Array }
watch 属性的每一个 key 都是观察对象的表达式,value 是回调函数或者方法名。Vue 实例将会在实例化时候调用 $watch(),遍历 watch 对象的每一个 property

从使用场景上分析

computed 中的方法依赖于 Vue 实例中 data 里的属性,如果发生改变了,会触发 computed 里面函数的执行。简单的讲就是当一个数据受多个数据影响的场景适合用 computed
而被 watch 的一个数据发生改变时跟随发生改变的情况下,即一个数据会影响多个数据的情况下,适合用 watch

对比

项目计算属性 computed侦听属性 watch说明
缓存支持(默认)不支持computed 只有依赖数据发生改变才会重新进行计算,watch 会直接触发相应操作
异步不支持支持computed 中的异步操作无效
使用场景一对一/多对一一对一/一对多
默认参数-(新值,旧值)
# vue  watch  computed 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×