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

防止Vue循环

南宫才艺
2023-03-14

我有三块地

小时——分钟——和总数

如果小时或分钟发生变化,我想计算一个总数。如果总数发生变化,我想计算相应的分钟和小时数。

例子:

1h 30分钟=1.5总计

2.25总计=2h 15分钟

我正试图用手表来达到这个目的

watch: {
            hour: {
                handler: (new_hour, old_hour) => {
                    if(isNaN(new_hour)){
                        manual.hour = old_hour
                    }else{
                        manual.setTotal();
                    }
                }
            },
            minutes: {
                handler: (new_minutes, old_minutes) => {
                    if(isNaN(new_minutes)){
                        manual.minutes = old_minutes
                    }else{
                        if(Number(new_minutes) > 60){
                            manual.minutes = old_minutes
                        }else{
                            manual.setTotal();
                        }
                    }
                }
            },
            total:{
                handler: (new_total, old_total) => {
                    if(isNaN(new_total)) {
                        manual.total = old_total;
                    }else{
                        const hour = new_total.split(",")[0];
                        const minutes = new_total.split(",")[1];
                        manual.hour = hour;
                        manual.minutes = (minutes * 60).toFixed(0);
                    }
                }
            }
        }

但是,这会导致一个循环,因为on处理程序总是调用另一个处理程序。如何以更明智的方式实现这一点?

共有2个答案

诸葛卜霸
2023-03-14

我还没有检查过这个,但是也许你可以用setter来交换计算属性的观察者,参见ref计算setter

请注意此处的注释——观察到的特性的循环依赖性#622(yyx990803于2014年12月11日发表评论)

问题是,即使存在循环依赖关系,最终值应该能够在1次额外迭代后稳定下来(Vue将停止,因为新的计算值是相同的)

我想你可以把

if (newValue === oldValue) {
  return
}

在每个观察者的顶部。这就是computed所做的。

万浩淼
2023-03-14

您可以使用onkeyup监听器(和/或更改)

new Vue({
	el: "#app",
  data: {
  	input_h: 0,
  	input_m: 0,
  	input_t: 0
  },
  methods: {
  update_h (e) {
  	this.input_h = Number(e.target.value)
    this.update_t(null)
  },
  update_m (e) {
  	this.input_m = Number(e.target.value)
    this.update_t(null)
  },
  update_t (e) {
  	if (e === null) {
    	this.input_t = Math.round((this.input_h + this.input_m / 60) * 100)/100
    } else {
    	this.input_t = Number(e.target.value)
      this.input_h = Math.floor(this.input_t)
      this.input_m = Math.round(this.input_t%1 * 60)
    }
    
  },
  }
})
html lang-html prettyprint-override"><script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.4.4/vue.js"></script>
<div id="app">
  <input :value="input_h" @keyUp="update_h"/>Hours<br/>
  <input :value="input_m" @keyUp="update_m"/>Minutes<br/>
  <input :value="input_t" @keyUp="update_t"/>Total<br/>
</div>
 类似资料:
  • 我有一个豆荚,里面有一些可怕的、有缺陷的软件。Kubernetes很棒的一个原因是,它会在软件崩溃时重新启动,这太棒了。 库伯内特斯是为好软件而设计的,而不是糟糕的软件,所以它在重启吊舱时会以指数级退避。这意味着我必须在崩溃之间等待五分钟才能重启吊舱。 有什么方法可以限制kubernetes的退避策略吗?我想把它改为在再次启动吊舱之前不要等待超过30秒。

  • 问题内容: 因此,我将顺序的ajax链接在一起,以按顺序加载URL数组。最初,我使用代替,并且无论哪种方式都可以正常工作- 只要所有网址都存在。但是,由于可能会丢失文件,因此我想对此进行补偿,然后,最后通知用户丢失了哪些文件,以便更轻松地进行纠正。 但是,问题是,在丢失的文件/ 404上,代码会像应执行的那样执行,但随后退出循环,从而阻止了进一步的ajax调用。因此,我认为,我需要某种方式来处理并

  • 今天,我开始使用MapSTRt为我的项目创建我的模型到DTO转换器,我想知道它是否自动处理循环引用,但事实证明它没有。 这是我用来测试它的转换器: 这就是测试: Notifica、AvvisionNotifica及其各自的模型都是带有setter和getter的简单POJO,因此我认为无需发布代码(如果您想知道,Notifica扩展了Corrispondenza) 这段代码进入了一个无限的循环,这

  • 问题内容: 我在http://www.leepoint.net/notes- java/flow/loops/foreach.html上 阅读。每个等价于 是 我的问题是每个循环的空列表如何工作。我知道对于常规的for循环,arr.length只会计算为0,并且循环不会执行。每个循环的呢? 问题答案: 我的问题是每个循环的空列表如何工作 也以相同的方式工作。如果长度为零,则永远不会执行循环。 它们

  • 附带以下代码段: 这段代码有条件地呈现两个图像中的一个。某些用户操作会导致实际显示的图像被切换。 我看到的是:当从说,切换到时,作为的一部分加载的图像将立即以不同的尺寸显示。但是,在图像加载到新源代码的过程中,仍然会显示带有src的图像。 这可能是由于Vue对两个模板使用了相同的img-tag。我如何防止Vue这样做,而是使用单独的img标签?

  • vue项目如何防止URL重定向 例如把 进行base64编码 拼接在地址后面,就能跳转到百度,如何设置白名单呢?是前端操作还是后端操作呀 希望大佬能帮忙解答一下