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

vue2 - vue监听store中的getter属性对象,watch触发了两次,并且两次获取的值一样,怎么回事?

钱弘壮
2024-05-31

在 store 中定义了一个 state 属性对象 taskObj,然后定义了一个 mutations 来设置这个变量,最后在某些页面通过watch来监听该 getter 属性,今天突然发现页面中监听该属性的地方执行了2次,并且打印出的内容完全一样,关键是这个 mutations 函数只执行了一次啊(端点调试)。

共有2个答案

淳于枫
2024-05-31

核心代码贴一下呗

伯君浩
2024-05-31

这个问题可能有几个原因,但是最常见的一个是 Vue 的响应式系统以及 watch 的工作方式导致的。在 Vue 中,当你使用 watch 来监听一个响应式属性时,Vue 会尝试在属性改变时触发 watch 的回调函数。但是,Vue 的响应式系统可能在一些边缘情况下触发多次更新,尽管数据本身可能并没有改变。

以下是一些可能的原因和相应的解决方案:

  1. 组件的重新渲染:组件可能因为某些原因被重新渲染,导致 watch 被触发。即使数据没有改变,Vue 的响应式系统也可能在重新渲染过程中重新评估 watch 的表达式。

    解决方案:确保组件的渲染只在其依赖的数据真正改变时发生。使用计算属性 (computed) 来替代复杂的 watch 表达式,以减少不必要的重新计算。

  2. 异步更新队列:Vue 使用了异步更新队列来优化性能。这意味着,当多个属性改变时,Vue 会将这些改变收集起来,然后在下一帧中一次性更新视图。这可能导致 watch 被触发多次,尽管看起来数据没有改变。

    解决方案:如果你依赖 watch 中的异步行为(例如,在 watch 中发起网络请求),请确保你的代码能够正确处理多次触发的情况。你可以使用防抖(debounce)或节流(throttle)技术来限制 watch 回调函数的执行频率。

  3. getter 的实现:有时,getter 的实现可能会导致看似相同的值被返回,但 Vue 的响应式系统认为它们是不同的。例如,如果 getter 返回了一个新的对象或数组,即使内容相同,Vue 也会认为数据已经改变。

    解决方案:确保 getter 返回的是相同的对象或数组引用,而不是每次都创建新的对象或数组。如果确实需要返回新的对象或数组,请考虑使用 Vue.setthis.$set 来确保 Vue 能够正确追踪这些变化。

  4. 父组件和子组件的通信:如果你的组件是嵌套的,并且父组件和子组件都监听了同一个 store 中的 getter,那么当这个 getter 的值改变时,两个组件的 watch 都可能被触发。

    解决方案:仔细检查你的组件层次结构,确保你只在需要的地方监听 getter。如果可能的话,尝试使用事件总线或 Vuex 的 action/mutation 来代替直接的 watch

请注意,要准确诊断问题的原因,你可能需要查看更多的代码和上下文信息。如果上述建议没有解决你的问题,建议你提供更多的代码和调试信息,以便进行更深入的分析。

 类似资料:
  • 本文向大家介绍watch怎么深度监听对象变化相关面试题,主要包含被问及watch怎么深度监听对象变化时的应答技巧和注意事项,需要的朋友参考一下 deep设置为true 就可以监听到对象的变化

  • 我通过infinispan缓存添加了CacheEntryExpired侦听器的n实现。addListener()方法。 侦听器事件在条目过期时激发。问题是,每次事件触发两次。 我验证(使用调试器和cache.getListeners())缓存不包含我的同一个侦听器的两个实例。getListeners的结果是: 所以只有一个听众。侦听器实现接口: 一个实现看起来像: 但是从接口中删除@CacheEn

  • 问题内容: 我有以下代码,但我的问题是该事件被触发了两次。我不知道是什么原因造成的。我怀疑是由供应商前缀引起的,但并非如此。即使我只离开,它仍然会开火两次。 CSS JS 问题答案: 对于您和,每个已转换的属性都会触发。 您可以在访问与事件关联的属性。 没有“ transition s end”事件,因此您可能需要一些技巧,例如仅过滤其中一个过渡属性的回调处理。例如: ps。没有浏览器会触发该事件

  • 问题内容: 出于某种原因,每当我在循环使用时按一下该键,此后的代码将立即执行两次。如果不在循环中,它将执行一次!为什么是这样? 这是一个测试它的代码片段: 问题答案: 发生这种情况的原因是,当您按Enter键时,System.in.read()将注册两个字符。应该将其用作扫描仪的更复杂版本,而不是使用扫描仪来执行Scanner.nextLine()或Scanner.nextInt()来返回字符串或

  • 问题内容: 我使用的是ng-click,将其应用于SPAN标签时会触发两次。 HTML 控制器 它应该只发射一次。我如何找到这种情况的发生原因以及如何解决? 问题答案: 您提供的代码不会两次触发该事件: http://jsfiddle.net/kNL6E/(单击) 也许您两次包含Angular?如果执行此操作,则会收到两个警报,如下所示: http://jsfiddle.net/kNL6E/1/