目录
一、Vue2写法
1、watch使用的几种方法
2、watch中的immediate、handler和deep属性
1.immediate 和 handler
2.deep深度监听
3、总结
二、Vue3写法
1、侦听单个数据
2、侦听多个数据
3、immediate属性
4、deep(深度监听)
一、Vue2写法
1、watch使用的几种方法
1、通过 watch 监听 data 数据的变化,数据发生变化时,就会打印当前的值
watch: {
data(val, value) {
console.log(val)
console.log(value)
}
}
2、通过 watch 监听 list 数据的变化,数据发生变化时,this.number++(使用深度监听)
data() {
return {
list: {
'id': 1,
'type': 0
},
number: 0
}
},
watch: {
list: {
handler(newVal) {
this.number++
},
deep: true
}
}
3、通过 watch 监听 data 数据的变化,数据发生变化时,执行 change 方法
watch: {
data: 'change' // 值可以为methods的方法名
},
methods: {
change(curVal,oldVal){
console.log(curVal,oldVal)
}
}
2、watch中的immediate、handler和deep属性
1.immediate 和 handler
- handler属性在watch中的作用是指定一个回调函数,在监视的数据发生变化时被调用
- 这样使用watch时有一个特点,就是当值第一次绑定时,不会执行监听函数,只有值发生改变时才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
data() {
return {
list: {
'id': 1,
'type': 0
},
number: 0
}
},
watch: {
list: {
handler(newVal) {
this.number++
},
immediate: true
}
}
2.deep深度监听
当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,此时就需要deep属性对对象进行深度监听。
data() {
return {
list: {
'id': 1,
'type': 0
},
number: 0
}
},
watch: {
list: {
handler(newVal) {
this.number++
},
deep: true
}
}
设置deep:true则可以监听到 list.id 的变化,此时会给 list 的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行 handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:
data() {
return {
list: {
'id': 1,
'type': 0
}
}
},
watch: {
'list.id': {
handler(newVal, oldVal) {
......
},
deep: true
}
}
这样只会给对象的某个特定的属性加监听器
3、总结
数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听
二、Vue3写法
侦听一个或者多个数据的变化,数据变化时执行回调函数,俩个额外参数 immediate控制立刻执行,deep开启深度侦听
1、侦听单个数据
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const count = ref(0)
// 2. 调用watch 侦听变化
watch(count, (newValue, oldValue)=>{
console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
})
</script>
2、侦听多个数据
侦听多个数据,第一个参数可以改写成数组的写法
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const count = ref(0)
const name = ref('cp')
// 2. 调用watch 侦听变化
watch([count, name], ([newCount, newName],[oldCount,oldName])=>{
console.log(`count或者name变化了,[newCount, newName],[oldCount,oldName])
})
</script>
3、immediate属性
在侦听器创建时立即出发回调,响应式数据变化之后继续执行回调文章来源:https://www.toymoban.com/news/detail-676928.html
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const count = ref(0)
// 2. 调用watch 侦听变化
watch(count, (newValue, oldValue)=>{
console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
},{
immediate: true
})
</script>
4、deep(深度监听)
通过watch监听的ref对象默认是浅层侦听的,直接修改嵌套的对象属性不会触发回调执行,需要开启deep文章来源地址https://www.toymoban.com/news/detail-676928.html
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const state = ref({ count: 0 })
// 2. 监听对象state
watch(state, ()=>{
console.log('数据变化了')
})
const changeStateByCount = ()=>{
// 直接修改不会引发回调执行
state.value.count++
}
</script>
<script setup>
// 1. 导入watch
import { ref, watch } from 'vue'
const state = ref({ count: 0 })
// 2. 监听对象state 并开启deep
watch(state, ()=>{
console.log('数据变化了')
},{deep:true})
const changeStateByCount = ()=>{
// 此时修改可以触发回调
state.value.count++
}
</script>
到了这里,关于Watch数据监听详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!