侦听器的类型
深层侦听
WARNING
- 深层侦听需要遍历对象中所有嵌套属性,对于大型数据结构,要注意性能开销。
- 在
Vue 3.5+
中,deep
选项还支持数字类型,用于指定侦听的深度。
默认情况下,直接给watch
传递一个响应式对象,会隐式创建深层侦听——即侦听对象内部的所有属性。
也可以显式使用deep
选项来创建深层侦听。
查看示例
vue
<template>
<div class="div-box">
<button @click="changeObj">changeObj</button>
<button @click="replaceObj">replaceObj</button>
<p>{{ isEqual }}</p>
</div>
</template>
<script setup lang="ts">
import { reactive, watch, ref } from 'vue'
const isEqual = ref()
const obj = reactive({
count: 0,
someObj: {
a: 1
}
})
// 隐式深层监听:嵌套属性变更时触发
watch(obj, (newObj, oldObj) => {
// 此处的 newObj 和 oldObj 是同一个对象
})
// 返回不同对象时触发
watch(
() => obj.someObj,
(newObj, oldObj) => {
// 仅当 obj.someObj 被替换时触发
}
)
const changeObj = () => obj.someObj.a++
const replaceObj = () => {
obj.someObj = { a: obj.someObj.a + 1 }
}
// 强制深层监听
watch(
() => obj.someObj,
(newObj, oldObj) => {
// 除非 obj.someObj 被整个替换: obj.someObj = { a: 2 }
// 否则此处的 newObj 和 oldObj 是同一个对象: obj.someObj.a++
isEqual.value = newObj === oldObj
},
{ deep: true }
)
</script>
即时侦听
watch 函数
默认在侦听源数据变化时才执行回调函数,可以通过immediate
选项来立即执行回调函数。
js
watch(
source,
(newValue, oldValue) => {
// 立即执行,且当 `source` 改变时再次执行
},
{ immediate: true }
);
一次性侦听
WARNING
仅支持 Vue 3.4+
watch 函数
默认在侦听源数据每次变化时执行回调函数,可以通过once
选项来仅执行一次。
js
watch(
source,
(newValue, oldValue) => {
// 当 `source` 变化时,仅触发一次
},
{ once: true }
);