Vue中computed和watch的区别
Vue中computed和watch的区别watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个或多个数据(称它们为依赖数据)发生变化的时候,所有依赖这些数据的 “相关” 数据 “自动” 发生变化,也就是自动调用相关的函数去实现数据的变动。(1)computed1、 支持缓存,只有依赖数据发生改变,才会重新进行计算;2、 不支持异步,当computed
Vue中computed和watch的区别
watch和computed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个或多个数据(称它们为依赖数据)发生变化的时候,所有依赖这些数据的 “相关” 数据 “自动” 发生变化,也就是自动调用相关的函数去实现数据的变动。
(1)computed
1、 支持缓存,只有依赖数据发生改变,才会重新进行计算;
2、 不支持异步,当computed内有异步操作时无效,无法监听数据的变化;
3、 computed是计算属性,也就是依赖某个值或者props通过计算得来的数据;
4、 computed的值是在getter执行之后进行缓存的,只有在它依赖的数据发生变化(依赖的数据可以是单个,也可以是多个)时,会重新调用getter来计算;
注意:就算data中没有直接声明要计算的变量,也可以直接在computed中写入,如下示例:
<p id="app"> {{fullName}} </p>
<script>
var vm = new Vue({
el: '#app',
data: {
firstName: 'Foo',
lastName: 'Bar',
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
</script>
计算属性默认只有getter,可以在需要的时候自己设定setter(所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例):
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]
}
}
}
//这个时候在控制台直接运行【vm.fullName = ‘bibi wang’】,相应的firstName和lastName也会改变。
(2)watch
1、不支持缓存,数据变,直接会触发相应的操作;
2、支持异步操作;
3、watch是监听器,可以监听某一个数据,然后执行相应的操作;
4、监听的函数接收两个参数,第一个参数是最新的值;第二个参数是输入之前的值;
var vm = new Vue({
el: '#app',
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
watch: {
firstName: function (newVal,oldVal) {
this.fullName = newVal + ' ' + this.lastName
console.log(newVal+'========='+oldVal)//Fooaaaa=========Foo
},
lastName: function (newVal,oldVal) {
this.fullName = this.firstName + ' ' + newVal
console.log(newVal+'========='+oldVal)//Baraaaa=========Bar
}
}
})
注意:如果data中没有相应的属性的话,是不能watch的,这点和computed不一样。
总结
-
当多个属性影响一个属性的时候,建议用computed
-
当一个值发生变化之后,会引起一系列的操作(改变其他属性值),这种情况就适合用watch
-
如果一个数据需要经过复杂计算就用 computed
-
如果在数据变化时执行异步或开销较大的操作时就用 watch
更多推荐
所有评论(0)