VueEternalLoading retry
by gavrashenko
HTML
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css">
<script src="https://unpkg.com/vue@3.2.25/dist/vue.global.js"></script>
<script src="https://cdn.jsdelivr.net/gh/ts-pro/vue-eternal-loading/dist/vue-eternal-loading.umd.js"></script>
<div id="app">
<div class="container">
<div v-for="user in users" :key="user.id" class="card mb-3">
<div class="row g-0">
<div class="col">
<img :src="user.avatar" class="rounded-start img-thumbnail m-1" alt="...">
</div>
<div class="col">
<div class="card-body">
<h5 class="card-title">{{ user.first_name }} {{ user.last_name }}</h5>
<p class="card-text">Email: {{ user.email }}.</p>
</div>
</div>
</div>
</div>
<vue-eternal-loading :load="load">
<template #error="{ retry }">
<div class="alert alert-danger" role="alert">
Oops! Looks like we've got an error.
<button @click="retry">
Try again
</button>
</div>
</template>
</vue-eternal-loading>
</div>
</div>
CSS
.vue-eternal-loading>div {
margin: 10px;
text-align: center;
}
JavaScript
// This url will return 404 error
const URL = 'https://reqres.in/api/unknown/23?delay=1';
const App = {
data() {
return {
users: [],
}
},
methods: {
loadUsers(page) {
// Page 99 doesn't exists, so we will get empty array
return fetch(URL)
.then(res => {
if (!res.ok) {
throw new Error('Server error')
}
return res;
})
.then(res => res.json())
.then(res => res.data);
},
load({ loaded, error }) {
this.loadUsers(this.page).then((users) => {
loaded();
}).catch(() => {
error();
})
}
}
};
const app = Vue.createApp(App);
app.component('vue-eternal-loading', window.TSPro.VueEternalLoading);
app.mount('#app');