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

Vue中如何遍历嵌套数组并每隔5秒依次展示数据?

解决Vue中多用户依次展示Info数据的问题

问题回顾

你有一个存储用户信息的嵌套数组,希望每个用户的资料框能每隔5秒依次展示Info数组里的数字,直到最后一个并保持显示。但最初的实现中,所有用户资料框都只显示最后一个用户的数据,后来尝试组件化方案时也遇到了同样问题,最终调整后解决了。

原方案的核心问题

你最初在父组件里用了全局的rate变量存储当前显示的数字,所有用户的定时器都会修改这个变量:

appendInfo: function() {
  for (let i = 0, l = this.arrays.length; i < l; i++) {
    let info = this.arrays[i]['Info'];
    let timer = 0;
    for (let i = 0; i < info.length; i++) {
      setTimeout(() => this.rate = info[i], timer);
      timer = timer + 5000;
    }
  }
}

因为所有定时器最终都会修改同一个this.rate,最后执行的定时器会覆盖之前的赋值,所以所有用户资料框都会显示最后一个用户的最后一个数字。

正确的组件化解决方案

要让每个用户的展示独立,最合理的方式是把“依次展示数字”的逻辑封装成独立组件,每个组件管理自己的状态,互不干扰。

1. 父组件代码

父组件负责循环渲染用户资料框,并把每个用户的Info数组传递给子组件:

<template>
  <div class="outer" v-for="(item, index) in arrays" :key="index" :id="item.name">
    <h4>{{ item.name }}</h4>
    <!-- 传递当前用户的Info数组给子组件 -->
    <rate-displayer :rates="item.Info" />
  </div>
</template>

<script>
import RateDisplayer from './RateDisplayer.vue'

export default {
  components: {
    RateDisplayer
  },
  data() {
    return {
      arrays: [
        { name: 'Max', Info: [60, 75, 70, 85, 65] },
        { name: 'Dave', Info: [70, 95, 60, 65, 83] }
      ]
    }
  }
}
</script>

2. RateDisplayer子组件代码

子组件接收rates数组,自己管理当前显示的数字和定时器:

<template>
  <div class="box c">Info: <span>{{ currentRate }}</span></div>
</template>

<script>
export default {
  props: {
    rates: {
      type: Array,
      required: true
    }
  },
  data() {
    return {
      currentIndex: 0,
      currentRate: null,
      displayTimer: null
    }
  },
  mounted() {
    // 初始化显示第一个数字
    this.currentRate = this.rates[0]
    // 启动定时器,每隔5秒切换下一个数字
    this.displayTimer = setInterval(() => {
      if (this.currentIndex < this.rates.length - 1) {
        this.currentIndex++
        this.currentRate = this.rates[this.currentIndex]
      } else {
        // 到最后一个数字时清除定时器,避免无效执行
        clearInterval(this.displayTimer)
      }
    }, 5000)
  },
  beforeUnmount() {
    // 组件销毁前清除定时器,防止内存泄漏
    if (this.displayTimer) {
      clearInterval(this.displayTimer)
    }
  }
}
</script>

为什么这个方案有效

每个RateDisplayer组件都有自己独立的currentIndex和currentRate状态,定时器只会修改当前组件内的变量,所以每个用户的数字展示都是独立进行的,不会互相覆盖。

你最后提到移除父组件中错误定义的props、interval和rate后功能正常,正是因为之前父组件的全局状态干扰了子组件的独立状态管理,移除后子组件就能正确地自己控制展示逻辑了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:37:35