Questa è una chiamata difficile considerando quanto poco sappiamo di ciò che sta accadendo nel tuo percorso di caricamento.
Ma...
Non ho mai avuto la necessità di costruire una rotta di caricamento, caricando solo componenti che vengono renderizzati su più rotte durante la fase di raccolta dati / init.
Un argomento per non avere una rotta di caricamento sarebbe che un utente potrebbe potenzialmente navigare direttamente verso questo URL (per errore) e quindi sembra che non avrebbe abbastanza contesto per sapere dove inviare l'utente o quale azione intraprendere. Anche se questo potrebbe significare che a questo punto cade attraverso un percorso di errore. Nel complesso, non è stata un'ottima esperienza.
Un altro è che se semplifichi i tuoi percorsi, la navigazione tra i percorsi diventa molto più semplice e si comporta come previsto / desiderato senza l'uso di $router.replace
.
Capisco che questo non risolve la domanda nel modo in cui stai ponendo. Ma suggerirei di ripensare questo percorso di caricamento.
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')
Conchiglia
<div>
<header>
<nav>...</nav>
</header>
<main>
<slot></slot>
</main>
</div>
Pagina principale
<section>
<form>...</form>
</section>
{
methods: {
onSubmit() {
// ...
this.$router.push('/results')
}
}
}
Pagina dei risultati
<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
}
})
}
}
}
Componente dei risultati
Fondamentalmente lo stesso identico componente di risultati che hai già, ma se loading
è vero, o se results
è nullo, comunque preferisci, puoi creare un set di dati falso per iterare e creare versioni di scheletri, se lo desideri. Altrimenti, puoi semplicemente mantenere le cose come le hai.
this.$router.replace({path: "/results/xxxx"})