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

vue3传入ref值没有被深层次监听?

汲雅珺
2024-04-11

VUE3官方文档写直接给 watch() 传入一个响应式对象,会隐式地创建一个深层侦听器——该回调函数在所有嵌套的变更时都会被触发。但在以下例子中,监听函数并没有被触发。

const testObj = ref({ a: { b: { c: 1 } } });watch(testObj, () => {  console.log(testObj.value.a.b.c, "testObj.value.a.b.c");});setTimeout(() => {  testObj.value.a.b.c = 2;}, 2000);

经过我的实验,增加{deep:true}则会触发。
可是,传入一个响应式对象不是默认深层次监听的吗?

共有1个答案

钱修雅
2024-04-11

在 Vue 3 中,watch() 函数确实可以隐式地创建深层侦听器,但这并不意味着它会监听所有嵌套的属性变化。在 Vue 3 的响应式系统中,只有被直接访问的属性才会被认为是“依赖”的,从而被侦听。在你的例子中,虽然 testObj 是一个响应式对象,但 testObj.value.a.b.c 这个属性路径在 watch() 被调用时并没有被直接访问,因此 Vue 不会隐式地创建对它的深层侦听器。

要解决这个问题,你可以显式地指定 deep: true 选项来创建一个深层侦听器,就像你在实验中所做的那样。这将告诉 Vue 去侦听 testObj 对象中所有嵌套属性的变化。

所以,你的代码应该像这样:

const testObj = ref({ a: { b: { c: 1 } } });watch(testObj, () => {  console.log(testObj.value.a.b.c, "testObj.value.a.b.c");}, { deep: true });setTimeout(() => {  testObj.value.a.b.c = 2;}, 2000);

这样,无论 testObj 对象中的哪个嵌套属性发生变化,watch() 的回调函数都会被触发。

 类似资料:
  • 我试图在EclipseIDE中使用Java编写一个插件。我必须在类中扩展JavaPlugin,但它说它不存在,我需要用它创建一个新类。我试着手动导入JavaPlugin,结果发现它不是一个包。 我试过导入org。巴基特。插件。JAVAJavaPlugin,但这似乎不起作用 现在应该是JConsolePlugin吗?当我悬停在问题上时,它要么说“创建类‘JavaPlugin’要么说“更改为JCons

  • 问题内容: 我需要一种方法来获取TensorFlow中任何类型的层(即Dense,Conv2D等)的输出张量的形状。根据文档,有可以解决问题的属性。但是,每次访问它都会得到。 这是显示问题的代码示例: 该语句将产生错误消息: 或将产生: 有什么办法可以解决该错误? PS: 我知道在上面的示例中,我可以通过获得输出张量的形状。但是我想知道为什么财产不起作用以及如何解决? 问题答案: TL; DR 我

  • 父组件用ref声明一数组 然后循环子组件并把数据传递给子组件 当父组件的数据发生变化时 希望子组件能监听到并响应 目前不知道为何没响应.请教哪里出了问题? 是不是这种业务场景最正规的是不是应该用reactive? 我试了一下 加immediate就可以了 但是我并不想第一次就触发

  • 我想引导一系列处理元素,并通过Guice将它们连接在一起。让我们假设以下路径: 需要一些输入 由实现需要 由实现需要 由实现需要 的依赖关系只能在运行时解决,而不能在配置时解决。通常的方法是在这种情况下使用辅助注入来创建工厂,该工厂将缺少的实例作为参数,如下所示: 但我真正想要的是这样的: 我不想在整个层次结构中手动传递AImpl的特定依赖项。使用Guice可以实现这一点吗?如果没有,在保持注射的

  • 问题内容: 在“深度”对象层次结构中使用Builder模式的最佳实践是什么?详细地说,我探讨了将Joshua Bloch提出的Builder模式应用于我的XML绑定代码的想法(我使用的是SimpleXML,但是这个问题将适用于任何情况)。我的对象层次结构深达4个级别,具有不同程度的复杂性。我的意思是,在某些级别上,我的对象只有几个属性,而在其他级别上,我最多可以有10个属性。 因此,请考虑以下假设

  • 本文向大家介绍深入理解JavaScript 参数按值传递,包括了深入理解JavaScript 参数按值传递的使用技巧和注意事项,需要的朋友参考一下 定义 ECMAScript中所有函数的参数都是按值传递的。 什么是按值传递呢? 也就是说,把函数外部的值复制给函数内部的参数,就和把值从一个变量复制到另一个变量一样。 按值传递 举个简单的例子: 很好理解,当传递 value 到函数 foo 中,相当于