You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3报Maximum recursive updates exceeded警告排查求助

错误原因

你遇到的递归更新警告,是因为在模板渲染阶段直接修改了响应式变量evenOddCount:evenOddCount++属于响应式数据的写操作,Vue在渲染模板时只要检测到响应式数据变更,就会触发新一轮渲染,新一轮渲染又会再次执行evenOddCount++,陷入无限更新循环,因此抛出该警告。你当前能拿到正确值是因为Vue内置了递归更新次数限制,到阈值后会强制终止更新,第一次渲染的计算结果刚好保留下来,但这个风险始终存在。

解决方案

方案1:预计算索引(最推荐)

通过计算属性把两层嵌套的列表打平,提前给每一项分配好序号,渲染时直接读取预计算的索引值,完全避免渲染过程中的数据修改,无任何副作用:

修改script部分

computed: {
    ...mapGetters('projects', { projects: 'getAllProjects' }),
    flatLaneItems() {
        let count = -1
        const list = []
        this.projects.forEach(project => {
            project.components.forEach(component => {
                list.push({
                    project,
                    component,
                    index: ++count
                })
            })
        })
        return list
    }
}

修改template部分

<template>
    <grid-swim-lane
        v-for="item in flatLaneItems"
        :key="`${item.project.id}-${item.component.id}`"
        :project="item.project"
        :component="item.component"
        :grid-row-even-odd-count="item.index"
    />
</template>

方案2:使用非响应式计数器(改动最小)

如果不想调整原有循环结构,把计数器改为非响应式即可,修改非响应式变量不会触发重渲染,自然不会陷入循环:

修改script部分

export default {
    components: { GridSwimLane },
    // 移除data中的evenOddCount声明,改为在created中挂载非响应式属性
    created() {
        this.evenOddCount = -1
    },
    // 每次组件更新前重置计数器,避免重复累加
    beforeUpdate() {
        this.evenOddCount = -1
    },
    computed: {
        ...mapGetters('projects', { projects: 'getAllProjects' })
    },
}

template部分不需要做任何修改,保持原有写法即可。

内容的提问来源于stack exchange,提问作者Daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:18:04