数组项循环后,使用计时器再次使用新数据重新循环它们
Posted
技术标签:
【中文标题】数组项循环后,使用计时器再次使用新数据重新循环它们【英文标题】:After array items loop, re-loop them again with new data using a timer 【发布时间】:2019-06-06 15:32:56 【问题描述】:我有一个非常简单的 v-for 数组循环,它从 Axios 抓取数据并将其显示在新闻卷中,该卷将自动显示每个新闻项目,一个接一个。这很好用,但几分钟后它会用完项目并显示一个空白 div,因为 API 上只有大约 30 个新闻项目。
我需要什么
在 v-for 数组用完项目后,我只想重新运行它。获取 API(因为 API 项每 30 秒更改一次),然后重新运行 v-for 数组,而无需用户刷新页面。
如下所示的Axios调用
axios.get('https://myapi/news_list')
.then(response =>
this.news = response.data
);
模板
<ul class="news-reel">
<li v-for="name in news">
<a :href="name.url">name.title</a>
</li>
</ul>
** 编辑 **
当我说它自动显示每个项目时,ul 只是有一个类动画,可以像新闻字幕卷轴一样滚动(或滑动)新闻项目。就是这样。
【问题讨论】:
我不确定我们看到的足够多,无法很好地了解您所描述的内容。听起来您说某处有一个计时器,但我们在这里看不到任何计时器,因此很难给出解决方案。 这只是一个非常简单的 类,它可以像新闻卷轴一样滚动项目。我在编辑中添加了更多内容。 【参考方案1】:您可以使用在created
钩子中初始化它的计时器,例如:
created()
setInterval(()=>
axios.get('https://myapi/news_list')
.then(response =>
this.news = response.data
);
,30000);
模拟的完整示例
new Vue(
el: '#app',
data()
return
news: [],
index: 0
,
computed:
cptNews()
return this.news.map((n, i) =>
let t = n;
t.id = i;
return t;
)
,
created()
setInterval(() =>
let n = ;
n.title = "News " + this.index;
n.url = "https://myapi/news_list/" + this.index;
this.news.push(n)
this.index++;
, 4000);
);
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Vue.delete">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>JS Bin</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.1/vue.min.js"></script>
</head>
<body>
<div id="app">
<ul class="news-reel">
<li v-for="name in cptNews">
<span>name.id</span>
<a :href="name.url">name.title</a>
</li>
</ul>
</div>
</body>
你的代码应该是这样的(不用mounted
):
data()
return
news: []
;
,
created()
setInterval(() =>
axios.get('https://myapi.co/news/')
.then(response =>
this.news = response.data.data
);
, 4000);
【讨论】:
这不起作用,我只是粘贴了您的代码,它确实每 30 秒重新调用 chrome 开发人员网络选项卡中的 API,但实际上并没有重新运行 v-for数组或更新当前的 v-for 数组。 如果你检查 vue devtoolsnews
数组的内容是什么?
它正在更改数组项目,但新闻卷轴仍然没有项目。无论如何要每 30 秒重新运行一次数组函数本身以便循环?
我通过一个模拟您的用例的示例更新了我的答案,它应该可以工作,因为您的新闻数据项是反应性的
这似乎也是最有意义的,它将项目添加到数组中但不正确。看这个截图:imgur.com/a/xRVTE39 如你所见,新闻项目以 89 结尾,然后每 4 秒添加新闻项目文本,但不是实际对象以上是关于数组项循环后,使用计时器再次使用新数据重新循环它们的主要内容,如果未能解决你的问题,请参考以下文章
循环遍历对象数组,并将它们转换为 UL 中的 LI 项 [重复]