Il s'agit d'un appel difficile compte tenu du peu que nous savons sur ce qui se passe dans votre itinéraire de chargement.
Mais...
Je n'ai jamais eu besoin de construire une route de chargement, seulement des composants de chargement qui sont rendus sur plusieurs routes pendant la phase de collecte des données / init.
Un argument pour ne pas avoir de route de chargement serait qu'un utilisateur pourrait potentiellement naviguer directement vers cette URL (accidentellement), puis il semble qu'il n'aurait pas assez de contexte pour savoir où envoyer l'utilisateur ou quelle action prendre. Bien que cela puisse signifier qu'il tombe sur une route d'erreur à ce stade. Dans l'ensemble, ce n'est pas une super expérience.
Un autre est que si vous simplifiez vos itinéraires, la navigation entre les itinéraires devient beaucoup plus simple et se comporte comme prévu / souhaité sans l'utilisation de $router.replace
.
Je comprends que cela ne résout pas la question de la manière que vous posez. Mais je suggère de repenser cette route de chargement.
App
<shell>
<router-view></router-view>
</shell>
const routes = [
{ path: '/', component: Main },
{ path: '/results', component: Results }
]
const router = new VueRouter({
routes,
})
const app = new Vue({
router
}).$mount('#app')
coquille
<div>
<header>
<nav>...</nav>
</header>
<main>
<slot></slot>
</main>
</div>
Page d'accueil
<section>
<form>...</form>
</section>
{
methods: {
onSubmit() {
// ...
this.$router.push('/results')
}
}
}
Page de résultats
<section>
<error v-if="error" :error="error" />
<results v-if="!error" :loading="loading" :results="results" />
<loading v-if="loading" :percentage="loadingPercentage" />
</section>
{
components: {
error: Error,
results: Results,
},
data() {
return {
loading: false,
error: null,
results: null,
}
},
created () {
this.fetchData()
},
watch: {
'$route': 'fetchData'
},
methods: {
fetchData () {
this.error = this.results = null
this.loading = true
getResults((err, results) => {
this.loading = false
if (err) {
this.error = err.toString()
} else {
this.results = results
}
})
}
}
}
Composante résultats
Fondamentalement, le même composant de résultats que vous avez déjà, mais si loading
c'est vrai ou si results
est nul, comme vous préférez, vous pouvez créer un faux ensemble de données pour itérer et créer des versions squelettes, si vous le souhaitez. Sinon, vous pouvez simplement garder les choses telles que vous les avez.
this.$router.replace({path: "/results/xxxx"})