VUE中watch用法
在vue中,使用watch
来响应数据的变化,watch
的用法大致有三种:
直接写一个监听处理函数,当每次监听到 name 值发生改变时,执行函数。
<template>
<div>
<input type="text" v-model="name">
</div>
</template>
<script>
export default {
data() {
return {
name: "a"
};
},
watch: {
name(newName, oldName) {
console.log(newName, oldName);
}
},
mounted: function() {},
components: {},
methods: {}
};
</script>
或者在所监听的数据后面直接加字符串形式的方法名:
<template>
<div>
<input type="text" v-model="name">
</div>
</template>
<script>
export default {
data() {
return {
name: "a"
};
},
watch: {
name:'nameChange'
},
mounted: function() {},
components: {},
methods: {
nameChange(newName, oldName){
console.log(newName, oldName)
},
}
};
</script>
这样使用watch
时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate
属性。
比如当父组件向子组件动态传值时,子组件props
首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate
设为true
。
<template>
<div>
<input type="text" v-model="name">
</div>
</template>
<script>
export default {
data() {
return {
name: "a"
};
},
watch: {
name: {
handler(newName, oldName) {
console.log(newName, oldName);
},
immediate: true
}
},
mounted: function() {},
components: {},
methods: {}
};
</script>
监听的数据后面写成对象形式,包含handler
方法和immediate
,之前我们写的函数其实就是在写这个handler
方法;immediate
表示在watch
中首次绑定的时候,是否执行handler
,值为true
则表示在watch
中声明的时候,就立即执行handler
方法,值为false
,则和一般使用watch
一样,在数据发生变化的时候才执行handler
。
当需要监听一个对象的改变时,普通的watch
方法无法监听到对象内部属性的改变,只有data
中的数据才能够监听到变化,此时就需要deep
属性对对象进行深度监听。
<template>
<div>
<input type="text" v-model="name.first">
<input type="text" v-model="name.last">
</div>
</template>
<script>
export default {
data() {
return {
name:{
first:'a',
last:'b'
}
};
},
watch: {
name: {
handler(newName, oldName) {
console.log(newName, oldName);
},
deep: true,
immediate: true
}
},
mounted: function() {},
components: {},
methods: {}
};
</script>
上面的监听是针对name的,当对象属性较多时,每个属性值的变化都会执行handler
。如果只需要监听对象中的一个属性值,则可以使用字符串的形式监听对象属性,这样只会给对象的某个特定的属性加监听器:
<template>
<div>
<input type="text" v-model="name.first">
<input type="text" v-model="name.last">
</div>
</template>
<script>
export default {
data() {
return {
name:{
first:'a',
last:'b'
}
};
},
watch: {
'name.first': {
handler(newName, oldName) {
console.log(newName, oldName);
},
deep: true,
immediate: true
}
},
mounted: function() {},
components: {},
methods: {}
};
</script>
注:数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听。