computed计算属性和watch侦听属性都是vue内常用的两个方法,其中computed计算属性依赖其它的属性计算所得出最后的值,watch侦听属性是监听一个值的变化,然后执行相对应的函数。
computed 计算属性
计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。
1. 支持缓存,只有依赖数据发生改变,才会重新进行计算
2. 不支持异步,当computed内有异步操作时无效,无法监听数据的变化
3. computed 属性值会默认走缓存,计算属性是基于它们的响应式依赖进行缓存的,也就是基于data中声明过或者父组件传递的props中的数据通过计算得到的值
4. 如果一个属性是由其他属性计算而来的,这个属性依赖其他属性,是一个多对一或者一对一,一般用computed
5.如果computed属性属性值是函数,那么默认会走get方法;函数的返回值就是属性的属性值;在computed中的,属性都有一个get和一个set方法,当数据变化时,调用set方法。
这里我们使用官方的案例:
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: {
// getter
get: function () {
return this.firstName + ' ' + this.lastName
},
// setter
set: function (newValue) {
var names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
}
})
这里我们可以发现fullName = firstName + lastName中fullName是没有定义到data中的,同时我们需要展示的也是fullname。
computed一般默认是只使用getter,那么此时computer是只能获取值不能更改值的,不过有需要的时候可以添加上setter,例如上面代码添加了setter的值,当fullName改变之后处理改变的新值并且传给data中的属性。
computed的值在getter执行后是会缓存的,只有在它依赖的属性值改变之后,下一次获取computed的值时才会重新调用对应的getter来计算。
所以上面代码的逻辑可以理解如下:
- 首先fullName = FooBar
- 之后再某一个地方修改了fullName的值,就调用了computer的setter,同时更改了firstName和lastName
- 更改了fullName的computer依赖的属性值之后,就会重新调用computer的getter,重新获取值,完成一次数据的更新
所以如果一个值依赖多个属性(多对一)的时候,就用computer
watch侦听属性
一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个 property。
1. 不支持缓存,数据变,直接会触发相应的操作;
2. watch支持异步;
3. 监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
4. 当一个属性发生变化时,需要执行对应的操作;一对多;
5. 监听数据必须是data中声明过或者父组件传递过来的props中的数据,当数据变化时,触发其他操作,函数有两个参数,
immediate:组件加载立即触发回调函数执行,
deep: 深度监听,为了发现对象内部值的变化,复杂类型的数据时使用,例如数组中的对象内容的改变,注意监听数组的变动不需要这么做。注意:deep无法监听到数组的变动和对象的新增,参考vue数组变异,只有以响应式的方式触发才会被监听到。
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
通过代码可以发现,watch是监听已经存在的数据firstName和lastName并且修改的fulName都是已经在data中定义的数据。同时watcher还会获取监听对象改变前后的值,并且做出一些处理。
watch: {
// 监听数据a
a: {
// 数据改变后执行的函数可以获取到newVal改变后的值和oldVal改变前的值,并且做一些炒作
handler(newVal,oldVal) {}
// 深度监听,为了发现对象内部值的变化,但是无法监听到具体对象里面那个属性的变化
deep: true,
// 组件加载立即触发回调函数执行
immediate: true
}
}
如果一个值变化后会引起一系列操作,或者一个值变化会引起一系列值的变化(一对多)的时候就是用watch