在 Vue.js 里,watch
和 watchEffect
都用于响应式地追踪数据变化并执行相应操作,不过它们在使用方式、应用场景等方面存在差异。
1. watch
watch
是 Vue 提供的一个选项,用于监听特定数据的变化。当监听的数据发生变化时,会触发相应的回调函数。
基本用法
<template>
<div>
<input v-model="message" placeholder="输入内容">
</div>
</template>
<script>
export default {
data() {
return {
message: ''
};
},
watch: {
message(newValue, oldValue) {
console.log(`新值: ${newValue}, 旧值: ${oldValue}`);
}
}
};
</script>
在上述代码里,watch
选项监听 message
数据的变化。当 message
的值改变时,会触发回调函数,回调函数接收两个参数:newValue
(新值)和 oldValue
(旧值)。
监听对象属性
若要监听对象的某个属性,可使用字符串路径:
<template>
<div>
<input v-model="user.name" placeholder="输入姓名">
</div>
</template>
<script>
export default {
data() {
return {
user: {
name: ''
}
};
},
watch: {
'user.name'(newValue, oldValue) {
console.log(`姓名新值: ${newValue}, 姓名旧值: ${oldValue}`);
}
}
};
</script>
深度监听
当需要监听对象内部属性的变化时,可使用 deep
选项:
<template>
<div>
<input v-model="user.name" placeholder="输入姓名">
</div>
</template>
<script>
export default {
data() {
return {
user: {
name: ''
}
};
},
watch: {
user: {
handler(newValue, oldValue) {
console.log('用户对象发生变化');
},
deep: true
}
}
};
</script>
2. watchEffect
watchEffect
是 Vue 3 引入的一个函数,它会立即执行传入的函数,并响应式地追踪函数内部依赖的所有响应式数据。当这些依赖的数据发生变化时,会重新执行该函数。
基本用法
<template>
<div>
<input v-model="message" placeholder="输入内容">
</div>
</template>
<script setup>
import { ref, watchEffect } from 'vue';
const message = ref('');
watchEffect(() => {
console.log(`当前消息: ${message.value}`);
});
</script>
在上述代码中,watchEffect
传入的函数会马上执行,并且会追踪 message
的变化。当 message
的值改变时,该函数会重新执行。
停止监听
watchEffect
返回一个停止函数,调用该函数可停止监听:
<template>
<div>
<input v-model="message" placeholder="输入内容">
<button @click="stop">停止监听</button>
</div>
</template>
<script setup>
import { ref, watchEffect } from 'vue';
const message = ref('');
const stop = watchEffect(() => {
console.log(`当前消息: ${message.value}`);
});
const stopWatch = () => {
stop();
};
</script>
3. 区别与使用场景
- 区别
- 语法形式:
watch
是一个选项,通常在组件选项中使用;watchEffect
是一个函数,在setup
函数中使用。 - 依赖追踪:
watch
需要明确指定要监听的数据;watchEffect
会自动追踪函数内部依赖的所有响应式数据。 - 执行时机:
watch
只有在监听的数据发生变化时才会执行回调函数;watchEffect
会立即执行传入的函数,并且在依赖数据变化时重新执行。
- 语法形式:
- 使用场景
- watch:适用于需要明确知道数据变化前后的值,或者需要监听特定数据的变化。
- watchEffect:适用于不需要明确指定依赖,只要依赖的数据变化就执行相应操作的场景。