vue.js 当尝试在内部执行函数时,在v-for循环上执行无限循环

jhiyze9q  于 2023-05-01  发布在  Vue.js
关注(0)|答案(1)|浏览(148)

这是非常简单的事情,我知道这是一个新手的错误,但我在这个问题上受阻。我想知道如何在模板内执行函数,而无需事件触发或渲染数据。在这个例子中,我不想增加numberOfItems,这是这个组件执行的循环数。在v-for中,我添加了{{ aFunctionCall()}},但这是在无限循环中执行的,因为组件正在尝试递归地重新呈现。
这是在控制台中给予我Vue的警告。日志:
已超过最大递归更新数。这意味着你有一个React性的效果,即改变自己的依赖关系,从而递归地触发自己。可能的源包括组件模板、呈现函数、更新的钩子或监视器源函数。
如何在每个循环中执行一个函数,而不需要递归地重新呈现?
这是组件代码。

<template>
        <div class="repeater-wrapper">
            <div 
                class="repeater-item"
                v-for="(input, index) in min"
            >
            {{ addNumberOfItems() }}
            {{ sayHello() }}
            </div>
        </div>
</template>

<script>
export default {
    props: {
        min: {
            type: Number
        },
        max: {
            type: Number,
            default: 10
        }
    },
    data() {
        return {
            status: 'normal',
            validate: true,
            numberOfItems: 0
        }
    },
    methods:{
        addNumberOfItems(number=1){
            console.log( 'It is fired', this.numberOfItems )
            this.numberOfItems += number;
            return this.numberOfItems;
        },
        sayHello(){
            //Any other function I want to execute on each loop
        }
    }
}
</script>

调用此组件的父组件是:

<Repeater :min="2"/>
3qpi33ja

3qpi33ja1#

你好,你可以这样修复它:

data() {
  return {
    status: 'normal',
    validate: true,
    tmp: 0,
    numberOfItems: 0,
  };
},
methods: {
  addNumberOfItems(number = 1) {
    console.log('It is fired', this.numberOfItems);
    this.numberOfItems += number;
    this.tmp = this.numberOfItems;

    return this.tmp;
  }

在您提供的第一个addNumberOfItems方法中,您正在分配this的结果。numberOfItems + number添加到tmp数据属性,这意味着numberOfItems属性未被直接修改。这可能就是为什么在模板中使用此方法时不会遇到无限循环的原因。
在第二个addNumberOfItems方法中,使用+=运算符直接修改numberOfItems属性,如果numberOfItems属性的使用方式导致模板依赖于它,则可能会触发模板的重新呈现。
例如,如果您有一个依赖于numberOfItems的computed属性,或者如果您在v-for循环或计算类中使用numberOfItems,则直接修改numberOfItems属性可能会导致模板重新呈现,如果处理不当,则会导致无限循环。
我建议修改变量名:)
希望对你有用!

相关问题