当前位置: 首页 > article >正文

vue3-自动收集依赖 watchEffect

在 Vue 3 中,watchEffect 是一个用于自动追踪响应式数据变化并执行副作用的 API。与 watch 不同,watchEffect 不需要手动指定要观察的数据,而是会自动根据内部访问的响应式数据进行依赖追踪。这使得 watchEffect 更加简洁和直观,适用于某些需要副作用的场景。

一、基本用法

在 Vue 3 组件中,可以直接使用 watchEffect 函数,无需额外导入。以下是一个简单的 watchEffect 示例:

<template>
  <div>
    <p>{
  
  { count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script setup>
import { ref, watchEffect } from 'vue';

const count = ref(0);

// 使用 watchEffect 监听 count 的变化
watchEffect(() => {
  console.log(`count is: ${count.value}`);
});

function increment() {
  count.value++;
}
</script>

在这个示例中,watchEffect 会立即执行一次,并在 count.value 发生变化时重新执行。每次点击按钮,count 的值都会增加,并且 watchEffect 内的回调函数会被触发,输出新的 count 值。

二、自动收集依赖

watchEffect 的核心特性之一是自动收集依赖。这意味着你不需要显式地指定要监听的数据,watchEffect 会自动追踪其内部所用到的响应式数据,并在这些数据发生变化时触发回调函数。

例如,在上面的示例中,watchEffect 自动追踪了 count 的变化,而无需我们手动指定 count 作为监听对象。

三、停止与清理

在某些情况下,你可能需要停止 watchEffect 的监听。这时,你可以使用 watchEffect 的返回值来停止监听。以下是一个示例:

<script setup>
import { ref, watchEffect } from 'vue';

const count = ref(0);

// 使用 watchEffect 并获取其返回值
const stop = watchEffect(() => {
  console.log(`count is: ${count.value}`);
});

// 在需要时停止监听
// stop();
</script>

此外,watchEffect 的回调函数还可以返回一个清理函数,用于在下次执行前或停止监听时进行清理。以下是一个示例:

<script setup>
import { ref, watchEffect } from 'vue';

const count = ref(0);

watchEffect(() => {
  console.log(`count is: ${count.value}`);

  // 返回一个清理函数
  return () => {
    console.log('Cleanup logic executed');
  };
});
</script>

在这个示例中,当 watchEffect 的监听被停止时(例如,当组件被销毁时),清理函数会被执行,输出 "Cleanup logic executed"。

四、与 watch 的区别
  1. 监听方式watchEffect 自动收集依赖,而 watch 需要明确指定监听的源。
  2. 执行时机watchEffect 在组件初始化时立即执行,而 watch 需要在源发生变化时才执行。
  3. 获取变化前后的值watchEffect 无法获取到变化前后的值,而 watch 可以。
五、应用场景

watchEffect 适用于以下场景:

  1. 当需要简单地监听数据的变化并执行响应逻辑时。
  2. 当需要自动追踪回调函数内部使用的所有响应式数据的变化时。

例如,在上面的示例中,我们使用 watchEffect 来监听 count 的变化,并在变化时输出新的值。这是一个典型的 watchEffect 应用场景。

总之,watchEffect 是 Vue 3 中一个非常强大的 API,它允许你自动追踪响应式数据的变化并执行副作用。通过合理使用 watchEffect,你可以提高代码的可读性和可维护性,并减少手动管理依赖的麻烦。


http://www.kler.cn/a/537252.html

相关文章:

  • MySQL 主从复制原理
  • p5r预告信生成器API
  • C# 综合运用介绍
  • 甘肃省医保刷脸设备激活步骤
  • 【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题
  • SQL条件分支中的大讲究
  • 基于HarmonyOS 3.0的智能理财APP开发方案
  • Docker在安装时遇到的问题(第一部分)
  • 基于 C# 开源的Netnr.Login组件库,maui开发实现 QQ、微信等多种主流第三方平台的登录授权
  • 防火墙、堡垒机和NAT
  • R语言 文本分析 天龙八部
  • 用 Python 给 Excel 表格截图(20250207)
  • 嵌入式工程师面试经验分享与案例解析
  • css实现长尾箭头(夹角小于45度的)
  • 拥抱开源,助力创新:IBM永久免费云服务器助力开源项目腾飞
  • 拆解Kotlin中的by lazy:从语法糖到底层实现
  • x64、aarch64、arm与RISC-V64:详解四种处理器架构
  • 杂乱果园环境中自主农业车辆地头转弯的高效安全轨迹规划
  • vmware ubuntu 扩展硬盘系统文件大小
  • Android修行手册-五种比较图片相似或相同
  • 数据分析:pandas.skew 复现
  • 每日一题——使用快排实现寻找第K大元素
  • python学opencv|读取图像(五十八)使用cv2.erode()函数实现图像腐蚀处理
  • Windows Docker笔记-在容器中运行项目
  • windows下搭建鸿蒙OS应用开发环境
  • Linux运维——文件内容查看编辑