【问题标题】:You may have an infinite update loop in a component render function error - solution?您可能在组件渲染函数错误中存在无限更新循环 - 解决方案?
【发布时间】:2019-10-11 15:45:24
【问题描述】:

出现错误“您可能在组件渲染函数中有无限更新循环。”完全不知道该怎么办?

我尝试将数组设为数据值。另外,我尝试过使用 for 循环。在第一种方法中似乎是孤立的。

data() {
  return { 
      activeTab: 0,
      uniqueLobs: []
    }
},
methods: {
    addDollarSymbol(val){
        var newVal = "$" + val;
        return newVal.replace(/<(?:.|\n)*?>/gm, ''); //trims white space
    },
    removeDuplicateLOB(lineOfBusiness) {
        //removes duplicate LOBs for tabs
        let incomingLobs = [];
        lineOfBusiness.forEach((business) => {
        incomingLobs.push(business.line_of_business.name);
        });
        this.uniqueLobs = [...new Set(incomingLobs)];
        return this.uniqueLobs;
    },
    showSpecificLobData(activeTab){
        //compares tab LOB to all incoming card data and shows only the LOB data for that specific tab
        let activeTabData = [];
        this.product_rate_card.forEach((product) => {
            if (product.line_of_business.name == this.uniqueLobs[activeTab] ) {
                activeTabData.push(product);
            }
        });
        return activeTabData;
    }
}

【问题讨论】:

  • 你能把你所有的代码贴在script标签里

标签: vue.js


【解决方案1】:

本例中的“循环”指的是无限递归,而不是for 循环。

该警告记录在这里:

https://github.com/vuejs/vue/blob/ff911c9ffef16c591b25df05cb2322ee737d13e0/src/core/observer/scheduler.js#L104

大部分代码的作用可能不是很明显,但代码的关键部分是 if (circular[id] &gt; MAX_UPDATE_COUNT) { 行,它检查特定观察者是否已被触发超过 100 次。

当响应式数据发生变化时,它将导致依赖于该数据的任何组件重新渲染。如果渲染过程更改了相同的数据,则将再次触发渲染。如果数据永远不会稳定,那么这将永远持续下去。

这是一个触发该警告的组件的简单示例:

<template>
    <div>
        {{ getNextCount() }}
    </div>
</template>

<script>
export default {
    data () {
        return {
            count: 1
        }
    },

    methods: {
        getNextCount () {
            this.count++

            return this.count
        }
    }
}
</script>

模板依赖于count,但通过调用getNextCount,它也会改变count的值。当该值更改时,组件将重新添加到渲染队列,因为依赖项已更改。它永远无法摆脱这个循环,因为价值不断变化。

由于您没有发布足够的代码,我无法确定是什么导致您的组件出现此问题。但是,它可能类似于this.uniqueLobs = ... 行,假设它在渲染期间被调用。一般来说,我建议避免在渲染阶段更改this 上的任何内容。渲染应该是只读的。通常,您会对要保留的任何派生数据使用计算属性。

【讨论】:

  • 我在上面的代码中添加了更多内容。事实证明,删除数据中设置的 uniqueLobs 解决了这个问题。
  • @MohammedFahad 您发布的额外代码并没有真正阐明任何内容,关键缺少的部分是模板或渲染功能。从数据中删除 uniqueLobs 将使其不响应,因此不会创建依赖项。这可能会使警告消失,但它正在颠覆反应系统。除非你完全理解这里发生了什么,否则它很可能会回来咬你。
  • 嗯,所以我的标签显示了基于 LOB 的不同数据。在我删除 uniqueLob = [] 后,无限循环错误消失了,单击每个选项卡都会为我提供每个选项卡所需的值/卡片
猜你喜欢
  • 1970-01-01
  • 2019-02-07
  • 2017-08-26
  • 2021-04-30
  • 2019-02-12
  • 2020-06-03
  • 2021-05-05
  • 2021-05-17
  • 2018-05-03
相关资源
最近更新 更多