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

Vue.js在v-for循环中递增全局变量出现无限循环问题求助

Vue中v-for循环实现递增数值的正确方式

你的写法触发了Vue的无限更新循环,这就是数值疯涨、控制台报错的原因——Vue的渲染函数是响应式的,每次调用incrementGlobalVariable()修改globalVariable,Vue会检测到数据变化并重新渲染;而重新渲染时又会再次调用这个方法修改数据,循环往复,最终导致数值飙升。

下面给出两种靠谱的解决方案:

方案1:直接利用v-for的index(最简洁)

如果你要的只是循环时的递增序号,v-for自带的index参数完全能满足需求,根本不需要额外的全局变量:

修改模板代码:

<div id="app">
  <ul>
    <li v-for="(post, index) in posts" :key="post.id">
      <p>Global Variable @ {{ post.title }}: {{ index + 1 }}</p>
    </li>
  </ul>
  <p>Global Variable: {{ posts.length }}</p>
</div>

这样直接就能得到你要的1、2、3,完全不会有循环问题。

方案2:初始化时预计算递增值(适用于复杂场景)

如果你的实际需求不是简单的列表序号,确实需要用变量记录递增结果,那应该在组件初始化阶段就计算好,而不是在渲染时修改数据:

修改JS代码:

new Vue({
  el: '#app',
  data() {
    return {
      globalVariable: 0,
      posts: [
        { id: 1, title: 'Post A' },
        { id: 2, title: 'Post B' },
        { id: 3, title: 'Post C' }
      ]
    };
  },
  created() {
    // 初始化时直接把全局变量设为最终值
    this.globalVariable = this.posts.length;
    // 要是需要给每个帖子单独绑定序号,可以这样做:
    // this.posts = this.posts.map((item, idx) => ({ ...item, seq: idx + 1 }));
  }
});

对应模板可以改成:

<div id="app">
  <ul>
    <!-- 用index的写法 -->
    <li v-for="(post, index) in posts" :key="post.id">
      <p>Global Variable @ {{ post.title }}: {{ index + 1 }}</p>
    </li>
    <!-- 如果用了map给帖子加seq,就这么写 -->
    <!-- <li v-for="post in posts" :key="post.id">
      <p>Global Variable @ {{ post.title }}: {{ post.seq }}</p>
    </li> -->
  </ul>
  <p>Global Variable: {{ globalVariable }}</p>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:33:33