vue中什么是侦听器
- 开发中我们在data返回的对象中定义了数据,这个数据可以通过插值语法等方式绑定到templat中。
- 当数据变化的时候,template里绑定的数据会自动进行更新来显示最新的数据。但是这种变化是在template中自动侦听data的值来进行变换的
- 在某些情况下,我们希望在代码逻辑中监听某个数据的变化,这个时候就需要用到侦听器watch了
官方定义:Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
一个对象,键是要侦听的响应式 property——包含了 data 或 computed property,而值是对应的回调函数。值也可以是方法名,或者包含额外选项的对象。组件实例将会在实例化时调用 $watch(),参阅 $watch,以了解更多关于 deep、immediate 和 flush 选项的信息
侦听器的用法
选项:watch 类型:{ [key: string]: string | Function | Object | Array} 侦听器watch的配置选项: 默认情况下,watch只是在侦听数据的引用变化,对于数据内部属性的变化是不会做出响应的: 这个时候我们可以使用一个选项deep进行更深层的侦听;另外一个属性,是希望一开始的就会立即执行一次:这个时候我们使用immediate选项;这个时候无论后面数据是否有变化,侦听的函数都会有限执行一次;
data的内容:
data() {
return {
info: {
name: 'cgj'
}
}
}
watch: {
info: {
handler(newValue, oldValue) {
console.log(newValue, oldValue)
}
deep: true,
immediate: true,
}
}
另外一个是Vue3文档中没有提到的,但是Vue2文档中有提到的是侦听对象的属性:
'info.name': function(newValue, oldValue) {
console.log(newValue, oldValue)
}
还有另外一种方式就是使用 $watch 的API: 具体$watch可以查看官方的API查看(用的方式比较少):实例方法 | Vue.js
const app = createApp({
data() {
return {
a: 1,
b: 2,
c: {
d: 4
},
e: 5,
f: 6
}
},
watch: {
a(val, oldVal) {
console.log(`new: ${val}, old: ${oldVal}`)
},
b: 'someMethod',
c: {
handler(val, oldVal) {
console.log('c changed')
},
deep: true
},
'c.d': function (val, oldVal) {
},
e: {
handler(val, oldVal) {
console.log('e changed')
},
immediate: true
},
f: [
'handle1',
function handle2(val, oldVal) {
console.log('handle2 triggered')
},
{
handler: function handle3(val, oldVal) {
console.log('handle3 triggered')
}
}
]
},
methods: {
someMethod() {
console.log('b changed')
},
handle1() {
console.log('handle 1 triggered')
}
}
})
const vm = app.mount('#app')
vm.a = 3
vue侦听器-watch
目标: 可以侦听data/computed属性值改变 语法:
watch: {
"被侦听的属性名" (newVal, oldVal){
}
}
例子代码:
<template>
<div>
<input type="text" v-model="name">
</div>
</template>
<script>
export default {
data(){
return {
name: ""
}
},
watch: {
name(newVal, oldVal){
console.log(newVal, oldVal);
}
}
}
</script>
<style>
</style>
总结: 想要侦听一个属性变化, 可使用侦听属性watch
vue侦听器-深度侦听和立即执行
目标: 可以侦听data/computed属性值改变 语法:
watch: {
"被侦听的属性名" (newVal, oldVal){
}
}
例子代码:
<template>
<div>
<input type="text" v-model="user.name">
<input type="text" v-model="user.age">
</div>
</template>
<script>
export default {
data(){
return {
user: {
name: "",
age: 0
}
}
},
watch: {
user: {
handler(newVal, oldVal){
console.log(newVal, oldVal);
},
deep: true,
immediate: true
}
}
}
</script>
<style>
</style>
总结: immediate立即侦听, deep深度侦听, handler固定方法触发
|