У меня есть очень простой цикл 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 просто есть анимация класса, которая прокручивает (или скользит) новостные элементы, например, ролик шатер новостей. Все это.
Вы можете использовать таймер, который вы инициализируете в 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);
}
news
?