computed和watch的区别

685 阅读2分钟

区别就是把两者之间各自说明,区别就不言而喻

Computed

计算属性

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。

例子:
image.png
那么计算属性里面不就是方法吗,用methods选项来代替不行吗?
可以将同一函数定义为一个方法而不是一个计算属性。两种方式的最终结果确实是完全相同的。然而,不同的是计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这对于性能优化是很有用的。
计算属性默认只有 getter,不过在需要时你也可以提供一个 setter

Watch

监听

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——特别是如果你之前使用过 AngularJS。然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。

例子:
image.png
使用计算属性就好了很多
image.png

虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

变化

什么叫做数据的变化呢
===规则判断
默认只判断一层
在变更 (不是替换) 对象或数组时,旧值将与新值相同,因为它们的引用指向同一个对象/数组。Vue 不会保留变更之前值的副本。

deep

为了发现对象内部值的变化,可以在选项参数中指定 deep: true。注意监听数组的变更不需要这么做。
比如监听obj
obj:{a:"a"} => obj:{a:"b"}    不会触发
当设置为deep:true后,就会触发了

数组也是对象
array:[]    => array:[1]    即使不设置deep: true也会触发

immediate

在选项参数中指定 immediate: true 将立即以表达式的当前值触发回调,也就是说当数据从无到有这一次也能监听