当前位置: 首页 > 知识库问答 >
问题:

vue.js - vue3 watchEffect 无法正确捕获多个依赖项?

常雅达
2024-05-06

测试地址
https://play.vuejs.org/#eNp9Us+LEzEY/Vc+cuqypT9QL7Ud/EEPelBRj...

场景如下

当我的 水温>=50 度 或者 水位>=5 的时候

要向后端发送一个请求

bug 复现步骤

  1. 点击水温到 50 以上
  2. 再次点击水位的时候 count 不会再变化

官方不是说 watchEffect 能收集到多个依赖吗?

但是对于有多个依赖项的侦听器来说,使用 watchEffect() 可以消除手动维护依赖列表的负担

共有2个答案

解浩渺
2024-05-06

借用 @jsdeferred 大佬的回复

每次执行完callback后都会清除此轮中没有用的依赖,height因为条件短路他的getter没有被执行导致他被清除掉不在当作是依赖,后面他的变更也不会使callback执行了
彭衡
2024-05-06

watchEffect 在 Vue 3 中确实可以自动收集依赖,并且当这些依赖发生变化时重新运行效应函数。但是,为了使其正常工作,你需要确保你正在访问的响应式数据在效应函数内部被正确地读取。

从你提供的测试地址来看,问题可能在于你是如何在 watchEffect 中使用 waterTempwaterLevel 的。你需要确保在 watchEffect 的回调函数中直接访问这些响应式属性,这样 Vue 就可以追踪它们的变化。

以下是一个简化的示例,演示了如何在 watchEffect 中正确使用多个依赖:

import { ref, watchEffect } from 'vue';export default {  setup() {    const waterTemp = ref(0);    const waterLevel = ref(0);    const count = ref(0);    watchEffect(() => {      if (waterTemp.value >= 50 || waterLevel.value >= 5) {        // 发送请求到后端        count.value++;      }    });    // 假设这是处理水温变化的函数    function handleWaterTempChange(newValue) {      waterTemp.value = newValue;    }    // 假设这是处理水位变化的函数    function handleWaterLevelChange(newValue) {      waterLevel.value = newValue;    }    return {      waterTemp,      waterLevel,      count,      handleWaterTempChange,      handleWaterLevelChange,    };  },};

在上面的代码中,waterTempwaterLevel 是响应式引用,当它们的值变化时,watchEffect 会自动重新运行。在 watchEffect 的回调函数中,我们直接访问了 waterTemp.valuewaterLevel.value,这样 Vue 就可以追踪这两个依赖。

请检查你的代码,确保你是以这种方式使用 watchEffect 的。如果你仍然遇到问题,请提供更多的代码上下文,以便我能更精确地帮助你解决问题。

 类似资料:
  • Maven将使用其最近的WINS策略自动解决依赖关系冲突,在这种情况下,它将在结果: [INFO]-(commons-collections:commons-collections:jar:2.1:compile-因与2.0冲突而省略) 在本例中,如果选择commons-collections:2.1,我将有一个备用依赖关系树,可能包含多个其他依赖关系。 我目前正在做的工作是识别与其他依赖项有冲突

  • 我正在纠结于捕获最后一组--使用我的正则表达式,只有第一行匹配模式,而不是其他两行。如果我将正则表达式更改为,则所有3行都匹配,但第一行捕获不成功(我只获得1组,而不是2组和)。 如何编写这个正则表达式,使所有行都有5个匹配组?

  • 本文向大家介绍JSON.parse 捕获异常的正确方法,包括了JSON.parse 捕获异常的正确方法的使用技巧和注意事项,需要的朋友参考一下 捕获无效JSON解析错误的最佳方法,是将对JSON.parse的调用放在try / catch块中。 示例

  • 无法确定任务“:app:processDebugResources”的依赖项。 无法解决配置的所有任务依赖关系: app: dedegRuntimeClasspath。无法解决com.facebook.android: facebook登录:[5,6)。 所需:项目:应用程序 尝试:使用--stack跟踪选项运行以获取堆栈跟踪。使用--info或--debug选项运行以获取更多日志输出。运行--c

  • 问题内容: 当我输入command go build时,我有一个项目具有来自bitbucket上私人存储库的多个依赖项。我得到这个错误 无法识别的导入路径“ bitbucket.xxx.xx / xx / x” x509:证书由未知授权机构签名 我已经尝试了几种方法,例如添加令牌 git config –global http.extraheader令牌 配置为ssh git config –gl

  • 我是一名新的Android学习者,我正在为语言翻译制作我的第一个Android应用程序。在添加了一些依赖项之后,我遇到了一些问题。我该怎么解决这个问题? Gradle同步失败:无法解决配置的所有依赖项: app: dedegRuntimeClasspath。无法确定android.arch.lifecycle的工件: livedata: 1.1.1:脱机模式下没有缓存版本有关详细信息,请参阅IDE