Vue3中watch的用法

在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监听器的行为,包括是否立即执行回调函数、是否深度监听、何时触发回调函数以及追踪数据的访问和变化。这些配置参数可以根据具体的需求来选择使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3 watch使用方式有所变化。下面介绍一下 Vue3 watch用法: 1. 监听单个变量 ```js import { watch } from 'vue'; watch( () => count.value, (newValue, oldValue) => { console.log(`count changed from ${oldValue} to ${newValue}`); } ); ``` 上面代码,`watch` 监听的是 `count.value` 这个变量,当 `count` 的值发生变化时,回调函数就会被触发。 2. 监听多个变量 ```js import { watch } from 'vue'; watch( [count1, count2], ([newVal1, newVal2], [oldVal1, oldVal2]) => { console.log( `count1 changed from ${oldVal1} to ${newVal1}, count2 changed from ${oldVal2} to ${newVal2}` ); } ); ``` 上面代码,`watch` 同时监听 `count1` 和 `count2` 两个变量,当任意一个变量的值发生变化时,回调函数就会被触发。 3. 监听对象或数组 ```js import { watch } from 'vue'; const obj = reactive({ count: 0, name: 'test', }); watch( () => obj, (newVal, oldVal) => { console.log( `obj changed from ${JSON.stringify(oldVal)} to ${JSON.stringify(newVal)}` ); } ); ``` 上面代码,`watch` 监听的是整个对象 `obj`,当 `obj` 任意一个属性的值发生变化时,回调函数就会被触发。 4. 监听异步变量 ```js import { watch, ref } from 'vue'; const count = ref(0); const asyncCount = ref(0); watch( count, async (newVal, oldVal) => { asyncCount.value = await someAsyncFunc(newVal); } ); ``` 上面代码,`watch` 监听的是 `count` 这个变量,回调函数是异步的,当 `count` 的值发生变化时,会调用 `someAsyncFunc` 异步函数,并将返回值赋值给 `asyncCount`。 以上就是 Vue3 watch用法,需要注意的是,在 Vue3 watch使用需要引入 `watch` 函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一花一world

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

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

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

打赏作者

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

抵扣说明:

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

余额充值