Dies ist eine schwierige Aufgabe, wenn man bedenkt, wie wenig wir über die Vorgänge auf Ihrer Laderoute wissen.
Aber...
Ich musste noch nie eine Laderoute erstellen, sondern nur Komponenten laden, die während der Init- / Datenerfassungsphase auf mehreren Routen gerendert werden.
Ein Argument für das Fehlen einer Laderoute wäre, dass ein Benutzer möglicherweise (versehentlich) direkt zu dieser URL navigieren könnte und dann nicht genügend Kontext vorhanden wäre, um zu wissen, wohin der Benutzer gesendet werden soll oder welche Maßnahmen er ergreifen soll. Dies könnte jedoch bedeuten, dass es an dieser Stelle zu einer Fehlerroute kommt. Insgesamt keine tolle Erfahrung.
Ein weiterer Grund ist, dass die Navigation zwischen Routen viel einfacher wird und sich wie erwartet / gewünscht verhält, wenn Sie Ihre Routen vereinfachen $router.replace
.
Ich verstehe, dass dies die Frage nicht so löst, wie Sie es stellen. Aber ich würde vorschlagen, diese Laderoute zu überdenken.
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')
Schale
<div>
<header>
<nav>...</nav>
</header>
<main>
<slot></slot>
</main>
</div>
Hauptseite
<section>
<form>...</form>
</section>
{
methods: {
onSubmit() {
// ...
this.$router.push('/results')
}
}
}
Ergebnisseite
<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
}
})
}
}
}
Ergebniskomponente
Grundsätzlich genau die gleiche Ergebniskomponente, die Sie bereits haben, aber wenn dies loading
zutrifft oder wenn results
es null ist, können Sie ein gefälschtes Dataset erstellen, um es zu iterieren und Skelettversionen zu erstellen, wenn Sie möchten. Ansonsten können Sie die Dinge einfach so halten, wie Sie sie haben.
this.$router.replace({path: "/results/xxxx"})