Vue watch详解

920 阅读4分钟

Vue2

watch选项可以作为一个函数来使用,也可以作为一个对象来使用。

watch选项作为函数

watch选项作为函数时,它接收两个参数:newValueoldValuenewValue是新值,oldValue是旧值。

以下是一个使用watch函数的例子:

const app = Vue.createApp({
  data() {
    return {
      message: 'Hello, Vue 3!'
    }
  },
  watch: {
    message(newValue, oldValue) {
      console.log(`新的值为:${newValue},旧的值为:${oldValue}`)
    }
  }
})

在上面的例子中,当message的值发生变化时,watch函数将被调用,打印出新值和旧值。

watch选项作为对象

watch选项作为对象时,它可以具有以下属性:

  • handler:与Vue 2中的handler属性类似,指定要执行的函数。
  • immediate:与Vue 2中的immediate属性类似,指定是否在初始值被设置后立即运行处理程序。默认为false
  • deep:与Vue 2中的deep属性类似,指定是否深度监听对象的属性。默认为false

以下是一个使用watch对象的例子:

const app = Vue.createApp({
  data() {
    return {
      message: 'Hello, Vue 3!'
    }
  },
  watch: {
    message: {
      handler(newValue, oldValue) {
        console.log(`新的值为:${newValue},旧的值为:${oldValue}`)
      },
      immediate: true,
      deep: true
    }
  }
})

在上面的例子中,当message的值发生变化时,handler函数将被调用,打印出新值和旧值。由于immediate属性被设置为true,因此处理程序将在初始值被设置后立即运行。由于deep属性被设置为true,因此message的所有子属性都将被深度监听。

取消watch

如果需要取消watch,可以使用watch()函数返回的一个取消watch的函数:

const app = Vue.createApp({
  data() {
    return {
      message: 'Hello, Vue 3!'
    }
  },
  watch: {
    message() {
      // do something
    }
  }
})

const unwatch = app.watch('message', () => {})
unwatch() // 取消watch

在上面的例子中,unwatch()将取消对messagewatch

Vue3

watch选项可以用来监视特定的数据源并在更改时运行函数。与watchEffect不同,您需要显式地定义要监视的数据源。

以下是一个使用watch选项的例子:

import { watch } from 'vue'

const count = ref(0)

watch(count, (newValue, oldValue) => {
  console.log(`新值为:${newValue},旧值为:${oldValue}`)
})

在上面的例子中,我们使用watch选项来监视count计数器的值。当计数器的值更改时,watch选项会调用传递给它的函数,并传递新值和旧值作为参数。

您还可以使用watch选项来监视多个数据源。在这种情况下,您可以将要监视的数据源放入一个数组中,并将函数作为最后一个参数传递。

以下是一个监视多个数据源的示例:

import { watch } from 'vue'

const count1 = ref(0)
const count2 = ref(0)

watch([count1, count2], (newValues, oldValues) => {
  console.log(`新值为:${newValues},旧值为:${oldValues}`)
})

在上面的例子中,我们使用watch选项来监视两个计数器count1count2。当其中任何一个计数器的值更改时,watch选项将调用传递给它的函数,并传递新值和旧值作为参数。

需要注意的是,watch选项也可以监视响应式对象的特定属性。在这种情况下,您需要将响应式对象和属性名称作为数组传递给watch选项。

以下是一个监视响应式对象属性的示例:

import { watch } from 'vue'

const user = reactive({
  name: 'Tom',
  age: 30
})

watch([user, 'age'], (newAge, oldAge) => {
  console.log(`新年龄为:${newAge},旧年龄为:${oldAge}`)
})

在上面的例子中,我们使用watch选项来监视user对象的age属性。当age属性更改时,watch选项将调用传递给它的函数,并传递新值和旧值作为参数。

watch选项中,您还可以传递选项对象来进一步控制监视行为。以下是一些常用的选项:

  • immediate: 如果设置为true,则会在watch选项的初始评估期间调用函数。默认值为false
  • deep: 如果设置为true,则会深入监视数据源的所有嵌套属性。默认值为false
  • flush: 控制什么时候运行监视函数。默认为'pre',即在响应式数据更改之前运行。还有'post'选项,表示在响应式数据更改之后运行。

以下是使用选项的示例:

import { watch } from 'vue'

const user = reactive({
  name: 'Tom',
  age: 30
})

watch(
  () => user.age,
  (newAge, oldAge) => {
    console.log(`新年龄为:${newAge},旧年龄为:${oldAge}`)
  },
  {
    immediate: true,
    deep: true,
    flush: 'post'
  }
)

在上面的示例中,我们使用watch选项来监视user对象的age属性。我们还传递了一个选项对象来启用immediatedeepflush选项。