1、Demo演示
Demo展示了一个姓名案例,First Name
和Last Name
的改变都会引起Full Name
的改变。
下面我们用Watch
和Computed
分别实现一下。
2、实现
2.1 watch
实现
<template>
<div>
<div><span>First Name:</span><input type="text" v-model="firstName"></div>
<div><span>Last Name:</span><input type="text" v-model="lastName"></div>
<div><span>Full Name:{{fullName}}</span></div>
</div>
</template>
<script>
export default {
name: 'Watch',
data() {
return {
firstName: 'lynn',
lastName: 'hung',
fullName: 'lynn hung'
}
},
watch: {
firstName(val) {
this.fullName = val + ' ' + this.lastName;
},
lastName(val) {
this.fullName = this.firstName + ' ' + val;
}
}
}
</script>
2.2 computed
实现
<template>
<div>
<div><span>First Name:</span><input type="text" v-model="firstName"></div>
<div><span>Last Name:</span><input type="text" v-model="lastName"></div>
<div><span>Full Name:{{fullName}}</span></div>
</div>
</template>
<script>
export default {
name: 'Computed',
data() {
return {
firstName: 'lynn',
lastName: 'hung'
}
},
computed: {
fullName() {
return this.firstName + ' ' + this.lastName;
}
}
}
</script>
单从目前的Demo案例来看,computed
的实现方式比watch
简洁许多。
watch
实现中需要事先准备好我们需要的fullName
属性。fullName
属性的变化依赖firstName
和lastName
的变化,那么我们就需要对firstName
和lastName
分别进行侦听
,观察到值发生改变后做出相应的操作。
试想,假设fullName
依赖的不止一两个值,而是许多值,那么我们都要对每一个值进行侦听吗?显然,这样的工作是重复性的。
单从这一角度讲,computed
更有优势。但考虑下面这种情况时,就不一定了。
3、Demo需求升级
将Demo的需求修改为:firstName
和lastName
的值改变后,经过2
秒再改变fullName
的值。
3.1 Watch
实现的核心代码修改
watch: {
firstName(val) {
setTimeout(() => {
this.fullName = val + ' ' + this.lastName;
}, 2000)
},
lastName(val) {
setTimeout(() => {
this.fullName = this.firstName + ' ' + val;
}, 2000);
}
}
将fullName
的修改代码片段放入了setTimeout
异步函数中,就可以实现想要的效果。
但是,这里用computed
缺不能实现同样的效果。可能你会想到这样去实现:
将代码片段computed
中的计算属性fullName
的返回值等2
秒再return
,如下。
computed: {
fullName() {
setTimeout(() => {
return this.firstName + ' ' + this.lastName;
}, 2000);
}
}
遗憾的是,这里的return
是箭头函数的返回值,并没有办法将该返回值给到fullName
。
总结
computed
和 watch
的区别:
- 能用
computed
实现的,一定能用watch
来实现; - 能用
watch
实现的,不一定能用computed
实现,比如watch
里面可以进行异步操作;
使用建议:
- 能用
computed
实现的地方优先用computed
来实现; - 当需要在数据变化时执行异步或开销较大的操作时,用
watch
来实现。