• 作者:老汪软件技巧
  • 发表时间:2024-11-12 15:04
  • 浏览量:

在 Vue 中,watch 是一个非常有用的函数,它用于监听 Vue 实例的数据变化。当被监听的数据发生变化时,watch 会执行回调函数。除了基本的监听数据变化,watch 还提供了几个选项,可以帮助你更灵活地控制回调函数的执行时机和行为。以下是几个主要的 watch 配置选项及其作用:

1. handler

handler 是监听器的回调函数,它会在数据变化时被调用。回调函数接受两个参数:

示例:

javascript
复制代码
data() {
    return {
        count: 0
    };
},
watch: {
    count(newVal, oldVal) {
        console.log(`count 从 ${oldVal} 变为 ${newVal}`);
    }
}

2. immediate

immediate 是一个布尔值,表示在监听开始时是否立即调用一次回调函数。如果为 true,在开始监听后立即执行回调函数。默认值为 false,即只有在数据变化时才会执行回调。

示例:

javascript
复制代码
data() {
    return {
        count: 0
    };
},
watch: {
    count: {
        handler(newVal, oldVal) {
            console.log(`count 从 ${oldVal} 变为 ${newVal}`);
        },
        immediate: true  // 立即调用回调函数
    }
}

3. deep

deep 选项用于监听对象或数组的深层变化。默认情况下,watch 只能监听对象或数组的引用变化,如果对象或数组的内部数据发生变化,watch 不会触发。如果需要监听对象内部属性的变化,可以将 deep 设置为 true。

示例:

javascript
复制代码
data() {
    return {
        person: { name: 'Alice', age: 30 }
    };
},
watch: {
    person: {
        handler(newVal, oldVal) {
            console.log('person 对象发生变化', newVal);
        },
        deep: true  // 监听对象的深层变化
    }
}

监听函数和回调函数的区别__listen监听函数

4. lazy (Vue 3.x 及以后版本)

在 Vue 3 中,lazy 是 watch 监听器的一个新的选项,默认情况下,watch 会在数据变化时执行回调,而如果设置了 lazy: true,则会在下一次 tick 时才触发回调。这个选项通常与 flush 配合使用,控制数据更新时的时机。

示例:

javascript
复制代码
data() {
    return {
        message: 'Hello, World!'
    };
},
watch: {
    message: {
        handler(newVal) {
            console.log('message updated:', newVal);
        },
        lazy: true  // 等待下一次 DOM 更新周期才执行
    }
}

5. flush (Vue 3.x 及以后版本)

flush 用于控制回调函数执行的时机。flush 可以有两个值:

示例:

javascript
复制代码
data() {
    return {
        count: 0
    };
},
watch: {
    count: {
        handler(newVal) {
            console.log('count 更新了:', newVal);
        },
        flush: 'sync'  // 在数据更新后立刻执行回调
    }
}

总结

在 Vue 中,watch 提供了多个配置选项来控制回调函数的执行方式,主要包括:

handler:指定数据变化时的回调函数。immediate:是否在初始化时立即执行回调。deep:是否监听对象或数组的深层次变化。lazy:是否延迟执行回调函数。flush:控制回调的执行时机,sync 或 post。