To trudne połączenie, biorąc pod uwagę, jak mało wiemy o tym, co dzieje się na trasie ładowania.
Ale...
Nigdy nie musiałem budować trasy ładowania, tylko ładowanie komponentów, które są renderowane na wielu trasach podczas etapu inicjowania / gromadzenia danych.
Jednym z argumentów za brakiem trasy ładowania byłoby to, że użytkownik mógłby potencjalnie przejść bezpośrednio do tego adresu URL (przypadkowo), a następnie wydaje się, że nie miałby wystarczającego kontekstu, aby wiedzieć, gdzie wysłać użytkownika lub jakie działania podjąć. Chociaż może to oznaczać, że w tym momencie popada w trasę błędu. Ogólnie rzecz biorąc, nie jest to świetne doświadczenie.
Innym jest to, że jeśli uprościsz swoje trasy, nawigacja między trasami stanie się znacznie prostsza i będzie działać zgodnie z oczekiwaniami / pożądanymi bez użycia $router.replace.
Rozumiem, że to nie rozwiązuje pytania w sposób, w jaki pytasz. Ale proponuję przemyśleć tę trasę ładowania.
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')
Muszla
<div>
<header>
<nav>...</nav>
</header>
<main>
<slot></slot>
</main>
</div>
Strona główna
<section>
<form>...</form>
</section>
{
methods: {
onSubmit() {
// ...
this.$router.push('/results')
}
}
}
Strona wyników
<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
}
})
}
}
}
Składnik wyników
Zasadniczo dokładnie ten sam składnik wyników, który już masz, ale jeśli loadingjest to prawda lub jeśli resultsma wartość null, jakkolwiek wolisz, możesz utworzyć fałszywy zestaw danych, aby iterować i tworzyć wersje szkieletowe, jeśli chcesz. W przeciwnym razie możesz zachować wszystko tak, jak chcesz.
this.$router.replace({path: "/results/xxxx"})