这是一个老生常谈的话题,两个选项实现的功能非常的类似,但实现原理和应用场景上有些不同
从文档/定义分析
从文档上看,这两个东西是有本质的区别的,一个叫“计算属性”,另一个叫“侦听属性”
他们可以公用类型 { [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 中的异步操作无效 |
使用场景 | 一对一/多对一 | 一对一/一对多 | |
默认参数 | - | (新值,旧值) |