【问题标题】:Logic Problem in Vue App is Causing an Infinite Loop due to Co-dependent VariablesVue 应用程序中的逻辑问题是由于相互依赖的变量而导致无限循环
【发布时间】:2026-01-26 08:05:02
【问题描述】:

我正在开发一个 vue 应用程序,它可以从法定货币转换为加密货币,反之亦然。该应用的演示可以在这里找到:Demo

您会注意到计算完成并在输入文本时自动显示在对面的输入框中。问题是目前该应用只监视绑定到输入的变量的变化。

当用户从选择框中选择另一个选项时,我还需要进行此计算。

我一直在努力思考如何在不导致无限循环的情况下实现这一点。

这是我天真的尝试:codepen

目前我对为什么这不起作用的理解是:

...input1 changes -> watch input1 called -> watch input1 modifies 
input2 -> watch input2 called -> watch input2 modifies input1....

这是一个无限循环。一定有 Vue 的一部分我还不够熟悉来处理这个确切的问题。

谢谢,

【问题讨论】:

  • 之前的computed解决方案有什么问题?
  • 您提供给我的计算解决方案只关注两个输入框中的变化。 I need the calculation to be preformed also when there is a change in the select boxes.有人建议我使用观察者来执行此操作。
  • 如果您还在计算属性中使用来自<select> 模型的值,它们也会在这些更改时更新。大概选择应该改变乘数
  • 我正在使用它们代替您示例中的 const mul 但据我了解,计算仅在 input1 或 input2 值的变化时进行。 this.val2 = (val / this.cryptoRates[this.selectedCrypto][this.selectedFiat]).toFixed(3) 我的直觉是我需要像文本框一样为两个选择器设置计算函数,但是我将如何避免写入全局变量并导致无限循环?
  • 啊,我明白你的意思了。我猜的问题是内部 values 仅在计算的 setter 中更新。如果你能以某种方式改变逻辑以使用 getter,你可能会有更多的运气

标签: javascript vue.js vuex vuetify.js


【解决方案1】:

使用@input 事件监听器。当您更改一个输入中的值时,已更改的输入将更新另一个输入的值。

<template>
  <div>
    <input v-model="value1" @input="update2"> 
    to 
    <input v-model="value2" @input="update1">
  </div>
</template>

<script>
const mul = 1.5;
export default {
  data: () => ({
    value1: null,
    value2: null
  }),
  methods: {
    update1() {
      this.value1 = this.value2 / mul;
    },
    update2() {
      this.value2 = this.value1 * mul;
    }
  }
};
</script>

您可以使用watch 来完成这项工作,但是您需要通过额外的检查来防止更新循环:

watch: {
  value1(val) {
    const tmp = val * mul;
    if (tmp !== this.value2) {
      this.value2 = tmp;
    }
  },
  value2(val) {
    const tmp = val / mul;
    if (tmp !== this.value1) {
      this.value1 = tmp;
    }
  }
},

但是这段代码假设乘以 x 然后除以 x 得到完全相同的数字,虽然这在数学上是正确的,但带有浮点数(javascript 的数字类型)您需要注意一些例外情况(NaN,舍入),这会使代码变得复杂。

因此我推荐输入事件监听器方法。

【讨论】:

  • 您的解决方案似乎有问题,这里有一个codepen 它不起作用。我想如果这确实有效,我可以在我的选择框中使用类似 @change="update1" 的东西?
  • 看起来@input 没有在 codepen 中触发,它在本地触发(使用 vue-cli)并且是的,将@change 事件添加到选择中。