1、基本用法:
当firstName值变化时,watch监听到并且执行
<template>
<div class="watch">
<p>FullName: {{ fullName }}</p>
<p>FirstName: <input type="text" v-model="firstName" /></p>
</div>
</template>
<script>
export default {
name: "listen",
data() {
return {
firstName: "Dawei",
lastName: "Lou",
fullName: ""
};
},
watch: {
// 普通监听
firstName(newName, oldName) {
this.fullName = newName + " " + this.lastName;
},
},
};
</script>
2、handler方法和immediate属性:
上面的例子是值变化时候,watch才执行,我们想让值最初时候watch就执行就用到了handler
和immediate
属性
immediate:组件加载立即触发回调函数执行,
deep: 深度监听,为了发现 对象内部值的变化,复杂类型的数据时使用,例如数组中的对象内容的改变,注意监听数组的变动不需要这么做。注意:deep无法监听到数组的变动和对象的新增,参考vue数组变异,只有以响应式的方式触发才会被监听到。
watch: {
// handler方式监听
firstName: {
handler(newName, oldName) {
this.fullName = newName + ' ' + this.lastName;
},
// 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法,
// 如果设置了false,那么效果和上边例子一样
immediate: true
}
}
3、deep属性(深度监听,常用语对象下面属性的改变):
<template>
<div class="watch">
<p>FullName: {{ obj.fullName }}</p>
<p>FirstName: <input type="text" v-model="obj.firstName" /></p>
</div>
</template>
<script>
export default {
name: "listen",
data() {
return {
obj: {
firstName: "Dawei",
lastName: "Lou",
fullName: ""
},
};
},
watch: {
// handler方式监听
obj: {
handler(newName, oldName) {
console.log('obj.firstName changed!!')
},
immediate: true
},
};
</script>
我们在在输入框中输入数据视图改变obj.firstName的值时,我们发现是无效的(console.log的日志打印不到)。
受现代 JavaScript 的限制 (以及废弃 Object.observe),Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。
默认情况下 handler 只监听obj这个属性它的引用的变化,我们只有给obj赋值的时候它才会监听到,比如我们在 mounted事件钩子函数中对obj进行重新赋值:
mounted: {
this.obj = {
firstName: 'jyy'
}
}
那么我们需要监听obj里的属性a的值呢?这时候deep属性就派上用场了:
watch: {
obj: {
handler(newName, oldName) {
console.log('obj.firstName changed');
},
immediate: true,
deep: true
}
}
这样的方法对性能影响很大,修改obj里面任何一个属性都会触发这个监听器里的 handler。我们可以对需要修改的具体值进行监听:
watch: {
'obj.firstName': {
handler(newName, oldName) {
console.log('obj.firstName changed');
},
immediate: true,
// deep: true
}
}
对象中某个值的监听,就不需要deep属性也可以监听到了
watch的注销这里就不在多说了,实际开发中,watch会随着组件一并销毁。