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

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就可以了 但是我并不想第一次就触发

  • vue3 div 绑定 ref 正常是这样的: 这样的怎么不可以:

  • 主要内容:实例,实例,实例本章节,我们将为大家介绍 Vue3 监听属性 watch,我们可以通过 watch 来响应数据的变化。 以下实例通过使用 watch 实现计数器: 实例 <div id = "app" >     <p style = "font-size:25px;" >计数器 : { { counter } } </p >     <button @click = "counter++" style = "f

  • 第一种方式: App.vue NavTree.vue 第二种方式: App.vue NavTree.vue 上面这两个种 ids 和 nav_ids 传值, 哪种传值会更快,还是说都一样,如果 navs 很多的时候

  • 我定义了一个组合式函数useCompute: 在组件中我这样使用: 我想在nums的长度改变之后能让item也改变,但是好像不起作用,我在组件中可以监听到 form.data.nums 的变化,但是在useCompute我监听不到,只有初次渲染组件的时候会执行一次watch里的函数,我才接触vue3,还有很多地方不是很懂,有大神可以帮忙解答下吗?十分感谢!

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