Vue3中watch的用法

Vue3引入了CompositionAPI,watchEffect和watch分别用于监听响应式数据变化。watchEffect自动追踪并立即执行副作用函数,而watch需显式指定源和回调。watch可监听多个数据,配置参数如immediate、deep等定制行为。

在Vue3中,watch 选项的用法与之前版本的Vue略有不同。Vue3中使用了Composition API,在组合式API中,watch 选项被替换成了一个新的函数 watchEffect 和一个新的函数 watch。下面是关于 watchEffectwatch 的用法说明:

watchwatchEffect

  1. watchEffect 函数:

    • watchEffect 函数会立即执行一个响应式的副作用函数,并在其所依赖的响应式数据发生变化时重新运行该副作用函数。
    • watchEffect 函数的语法如下:
      watchEffect(effect: () => void): StopHandle
      
    • 示例代码:
      import { watchEffect, reactive } from 'vue';
      
      const data = reactive({ count: 0 });
      
      watchEffect(() => {
        console.log('Count:', data.count);
      });
      
      // 修改数据,触发副作用函数
      data.count++; // 输出:"Count: 1"
      
  2. watch 函数:

    • watch 函数用于观察一个或多个响应式数据,并在数据发生变化时执行相应的回调函数。
    • watch 函数的语法如下:
      watch(source: Ref | (() => any) | (() => any)[], callback: () => void): StopHandle
      
    • source 可以是一个 Ref 对象、一个计算函数或一个包含多个计算函数的数组。
    • callback 是一个回调函数,在 source 的值发生变化时执行。
    • 示例代码:
      import { reactive, watch } from 'vue';
      
      const data = reactive({ count: 0 });
      
      watch(() => data.count, (newCount, oldCount) => {
        console.log('Count changed:', newCount, oldCount);
      });
      
      // 修改数据,触发回调函数
      data.count++; // 输出:"Count changed: 1 0"
      

这就是Vue3中watch的用法。通过watchEffectwatch函数,你可以方便地观察和响应响应式数据的变化。需要注意的是,在Vue3中,watchEffectwatch是在 setup 函数中使用的,因为Composition API主要是用于组件的逻辑复用,而不是在选项中声明。

在对比watchEffectwatch时,可以总结出以下区别:

  • watchEffect函数会立即执行副作用函数,并在其依赖的响应式数据发生变化时重新运行副作用函数,而watch函数需要显式地指定要监听的数据和回调函数。
  • watchEffect函数没有明确的依赖关系,它会自动追踪副作用函数中使用的所有响应式数据,而watch函数需要显式地指定要监听的数据。
  • watchEffect函数的副作用函数没有参数,而watch函数的回调函数会接收到新值和旧值作为参数。
  • watch函数可以监听多个数据的变化,而watchEffect函数只能监听一个副作用函数中使用的响应式数据的变化。

根据具体的使用场景,你可以选择使用watchEffectwatch函数来监听响应式数据的变化。

watch监听多个数据

在Vue3中,可以使用watch函数来监听多个数据的变化。watch函数接受一个数组作为第一个参数,数组中可以包含多个响应式数据或计算函数。当数组中的任一数据发生变化时,都会触发回调函数。

下面是一个示例代码,演示了如何使用watch函数监听多个数据的变化:

import { reactive, watch } from 'vue';

const data = reactive({
  count1: 0,
  count2: 0,
});

watch([() => data.count1, () => data.count2], ([newCount1, newCount2], [oldCount1, oldCount2]) => {
  console.log('Count changed:', newCount1, newCount2, oldCount1, oldCount2);
});

// 修改数据,触发回调函数
data.count1++; // 输出:"Count changed: 1 0 0 0"
data.count2++; // 输出:"Count changed: 1 1 1 0"

在上述示例中,我们使用了一个包含两个计算函数的数组作为watch函数的第一个参数。当data.count1data.count2的值发生变化时,回调函数会被触发,并且可以获取到新的值和旧的值。

需要注意的是,回调函数的参数是一个数组,包含了所有被监听数据的新值和旧值,按照数组中的顺序对应着监听数据的顺序。

通过这种方式,你可以方便地监听多个数据的变化,并在回调函数中进行相应的处理。

watch监听器的配置参数

watch函数在监听响应式数据变化时,可以接收一个可选的配置对象作为第三个参数。这个配置对象可以用来自定义watch监听器的行为。

配置对象可以包含以下属性:

  • immediate:布尔值,表示是否在初始渲染时立即执行回调函数。默认值为false
  • deep:布尔值,表示是否深度监听对象或数组的变化。如果为true,则会递归监听对象内部的属性或数组的元素的变化。默认值为false
  • flush:字符串,表示何时触发回调函数。可选值为"pre""post""sync"。默认值为"post"。其中:
    • "pre":在DOM更新之前同步触发回调函数。
    • "post":在DOM更新之后异步触发回调函数。
    • "sync":在DOM更新之前同步触发回调函数,并且在DOM更新之后再次异步触发回调函数。
  • onTrack:函数,用于追踪响应式数据的访问。当监听的数据被访问时,会调用该函数。函数的参数是一个DebuggerEvent对象,包含了相关的信息。
  • onTrigger:函数,用于追踪响应式数据的变化。当监听的数据发生变化时,会调用该函数。函数的参数是一个DebuggerEvent对象,包含了相关的信息。

示例代码:

import { reactive, watch } from 'vue';

const data = reactive({ count: 0 });

watch(
  () => data.count,
  (newCount, oldCount) => {
    console.log('Count changed:', newCount, oldCount);
  },
  {
    immediate: true,
    deep: true,
    flush: 'sync',
    onTrack: (event) => {
      console.log('Tracked:', event);
    },
    onTrigger: (event) => {
      console.log('Triggered:', event);
    },
  }
);

// 修改数据,触发回调函数
data.count++; // 输出:"Tracked:", "Triggered:", "Count changed: 1 0"

通过配置对象,你可以自定义watch监听器的行为,包括是否立即执行回调函数、是否深度监听、何时触发回调函数以及追踪数据的访问和变化。这些配置参数可以根据具体的需求来选择使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一花一world

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值