Vue 3中的watch和watch effect

166 阅读4分钟

watch和watchEffect都是用来监测数据变化的方法,但它们的使用方式有所不同。如果需要在数据变化时执行指定的函数,可以使用watch;如果需要在函数中使用响应式数据并自动追踪变化,可以使用watchEffect

watch选项允许您在组件中声明一个侦听器,以便在监测的数据发生变化时执行特定的函数。它还允许您设置deep选项,以便深度监测数据的变化,这对于监测对象或数组的变化非常有用。watch选项还允许您设置immediate选项,以便在初始渲染时立即执行一次监测函数。

watchEffect允许您在组件中创建一个函数,并在该函数中使用响应式数据。watchEffect会自动追踪在函数中使用的所有响应式数据的变化,并在变化时执行该函数。这使得它比watch更灵活和方便,特别是当您需要在一个函数中使用多个响应式数据时。

watch是Vue3中已有的响应式API之一,它可以监听一个特定的数据变化,并在数据变化时执行对应的回调函数。watch的使用方式是通过一个对象来定义监听的数据和回调函数,例如:

watch: {
  count: function (newVal, oldVal) {
    // 在count变化时执行的回调函数
  }
}

在这个例子中,当count这个数据发生变化时,就会执行定义的回调函数。

watchEffect则是Vue3中新增的一个API,它与watch相比更加灵活和简洁。watch effect可以直接监听一个函数或者表达式的变化,并在变化时执行对应的回调函数。例如:

import { watchEffect } from 'vue'

watchEffect(() => {
  // 监听的函数或表达式
  console.log(count.value)
})

在这个例子中,watchEffect直接监听一个函数,当这个函数中使用的响应式数据count发生变化时,就会执行定义的回调函数。

下面详细来描述一下watch和watchEffect

watch

watch 是一个函数,用于监听特定数据的变化,并在数据发生变化时执行回调函数。它可以监视单个响应式数据、多个响应式数据或计算属性的变化。

使用语法如下:

    
javascript
插入代码复制代码
watch(source, callback, options?)

    
  • source:可以是一个响应式数据、一个计算属性或一个返回响应式数据的函数。
  • callback:当 source 中的数据发生变化时,该回调函数将被调用。
  • options (可选):可以定义一些选项,如 deep(深度监听)、immediate(立即执行回调)等。

示例:

    
javascript
插入代码复制代码
import { watch } from 'vue';

watch(() => state.value, (newVal, oldVal) => {
  // 该回调函数将在 state.value 发生变化时调用
  console.log('state.value 变化了', newVal, oldVal);
});

    

watchEffect

watchEffect 是一个函数,它会立即执行一次,并自动追踪其中使用的响应式数据。当任何被追踪的响应式数据发生变化时,watchEffect 会重新执行。

使用语法如下:

    
javascript
插入代码复制代码
watchEffect(callback)

    
  • callback:用于定义逻辑的函数。

示例:

    
javascript
插入代码复制代码
import { watchEffect } from 'vue';

watchEffect(() => {
  // 当依赖的响应式数据发生变化时,该回调函数将被调用
  console.log('依赖的响应式数据发生变化了');
});

    

watchEffect 不需要指定依赖项,它会自动追踪所使用的响应式数据。这使得编写简单的副作用代码更加便捷。

watch和watchEffect的主要区别在于:

  1. 语法不同:watch使用选项API,需要在组件选项中定义一个名为watch的对象,而watchEffect是一个函数API,可以在组件中直接使用。
  2. watch需要显式指定要观察的数据,而watchEffect会自动追踪在函数中使用的响应式数据,并在这些数据发生变化时重新运行函数。
  3. watch可以指定回调函数,以在数据变化时执行自定义操作,而watchEffect不需要指定回调函数,它会自动运行函数中的代码。

总的来说,如果你需要在数据变化时执行自定义操作,可以使用watch;如果你只需要根据响应式数据自动更新一些数据或执行一些操作,可以使用watchEffect。在Vue3中,watch和watchEffect都是用来监听响应式数据变化的方法。