Vue中watch 的用法
基础用法代码
<div>
<p>FullName: {{fullName}}</p>
<p>FirstName: <input type="text" v-model="firstName"></p>
</div>
<script>
export default {
data: {
firstName: "Dawei",
lastName: "Lou",
fullName: ""
},
watch: {
firstName(newName, oldName) {
this.fullName = newName + " " + this.lastName;
}
}
};
</script>
上面的代码的效果是,当我们输入firstName
后,wacth
监听每次修改变化的新值,然后计算输出fullName
。
handler方法和immediate属性
这里 watch 的一个特点是,最初绑定的时候是不会执行的,要等到 firstName
改变时才执行监听计算。那我们想要一开始就让他最初绑定的时候就执行改怎么办呢?我们需要修改一下我们的 watch 写法,修改过后的 watch 代码如下:
watch: {
firstName: {
handler(newName, oldName) {
this.fullName = newName + ' ' + this.lastName;
},
// 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法
immediate: true
}
}
注意到handler
了吗,我们给 firstName 绑定了一个handler
方法,之前我们写的 watch 方法其实默认写的就是这个handler
,Vue.js会去处理这个逻辑,最终编译出来其实就是这个handler
。
而immediate:true
代表如果在 wacth 里声明了 firstName 之后,就会立即先去执行里面的handler方法,如果为 false
就跟我们以前的效果一样,不会在绑定的时候就执行。
deep属性
watch 里面还有一个属性 deep
,默认值是 false
,代表是否深度监听,比如我们 data 里有一个obj
属性:
<div>
<p>obj.a: {{obj.a}}</p>
<p>obj.a: <input type="text" v-model="obj.a"></p>
</div>
<script>
export default {
data: {
obj: {
a: 123
}
},
watch: {
obj: {
handler(newName, oldName) {
console.log("obj.a changed");
},
immediate: true,
deep: true
}
}
};
</script>
优化,我们可以是使用字符串形式监听其中某个值
watch: {
'obj.a': {
handler(newName, oldName) {
console.log('obj.a changed');
},
immediate: true,
// deep: true
}
}