在 Vue 3 中,watch
API 得到了增强和重新设计,以提供更加灵活和强大的响应式数据监听能力。Vue 3 引入了 Composition API,其中 watch
函数是 Composition API 的一部分,允许你在 setup()
函数中直接监听响应式引用(ref)或响应式对象(reactive)的变化。
基本用法
在 Vue 3 的 Composition API 中,watch
函数的基本用法如下:
javascript复制代码
|---|----------------------------------------------------------|
| | import { ref, watch, onMounted } from 'vue';
|
| | |
| | export default {
|
| | setup() {
|
| | const count = ref(0);
|
| | |
| | // 监听 count 的变化
|
| | watch(count, (newValue, oldValue) => {
|
| | console.log(`count 从 ${oldValue} 变成了 ${newValue}`);
|
| | });
|
| | |
| | // 可以在 onMounted 中启动异步操作,并在完成后更新 count
|
| | onMounted(() => {
|
| | setTimeout(() => {
|
| | count.value++;
|
| | }, 1000);
|
| | });
|
| | |
| | return {
|
| | count,
|
| | };
|
| | },
|
| | };
|
监听多个源
watch
也可以同时监听多个响应式引用或响应式对象,当它们中的任何一个发生变化时,都会执行回调函数。
javascript复制代码
|---|-------------------------------------------------------------------------------------------------|
| | import { ref, watch } from 'vue';
|
| | |
| | export default {
|
| | setup() {
|
| | const firstName = ref('John');
|
| | const lastName = ref('Doe');
|
| | |
| | watch([firstName, lastName], ([newFirstName, newLastName], [oldFirstName, oldLastName]) => {
|
| | console.log(`名字从 ${oldFirstName} ${oldLastName} 变成了 ${newFirstName} ${newLastName}`);
|
| | });
|
| | |
| | return {
|
| | firstName,
|
| | lastName,
|
| | };
|
| | },
|
| | };
|
深度监听
默认情况下,watch
只会监听响应式引用的值的变化,而不会深入监听对象内部属性的变化。如果你需要深度监听一个响应式对象,可以传递第三个参数 { deep: true }
。
javascript复制代码
|---|----------------------------------------------------|
| | import { reactive, watch } from 'vue';
|
| | |
| | export default {
|
| | setup() {
|
| | const user = reactive({
|
| | name: 'John Doe',
|
| | age: 30,
|
| | });
|
| | |
| | watch(user, (newValue, oldValue) => {
|
| | // 注意:这里不会触发,因为 user 对象引用没有变
|
| | // 除非使用深度监听
|
| | }, { deep: true });
|
| | |
| | // 深度监听 user 对象内部属性的变化
|
| | watch(() => user.name, (newName, oldName) => {
|
| | console.log(`名字从 ${oldName} 变成了 ${newName}`);
|
| | });
|
| | |
| | return {
|
| | user,
|
| | };
|
| | },
|
| | };
|
立即执行
如果你希望在监听开始时立即执行回调函数,可以传递 { immediate: true }
作为 watch
的第四个参数。
javascript复制代码
|---|-------------------------------------------|
| | watch(count, (newValue, oldValue) => {
|
| | // ...
|
| | }, { immediate: true });
|
停止监听
watch
函数返回一个停止监听的函数。你可以调用这个函数来停止监听响应式数据的变化。
javascript复制代码
|---|-------------------------------------------------------------|
| | const stopWatch = watch(count, (newValue, oldValue) => {
|
| | // ...
|
| | });
|
| | |
| | // 停止监听
|
| | stopWatch();
|
这些是使用 Vue 3 中 watch
函数的基本和高级用法。通过灵活使用这些功能,你可以有效地管理组件中的响应式数据变化。