Це важкий виклик, враховуючи, як мало ми знаємо про те, що відбувається у вашому маршруті завантаження.
Але ...
У мене ніколи не виникало необхідності будувати маршрут завантаження, тільки коли-небудь завантажувальний компонент (и), який отримується на декількох маршрутах під час етапу збору даних / init.
Одним із аргументів для відсутності маршруту завантаження є те, що користувач може потенційно перейти безпосередньо до цієї URL-адреси (випадково), і тоді здається, що у нього не буде достатньо контексту, щоб знати, куди надіслати користувача або які дії вжити. Хоча це може означати, що в цей момент він потрапляє на маршрут помилки. Загалом, не великий досвід.
Інша полягає в тому, що якщо ви спростите свої маршрути, навігація між маршрутами стає набагато простішою і поводиться так, як очікувалося / бажано, без використання $router.replace
.
Я розумію, це не вирішує питання так, як ви ставите. Але я б запропонував переглянути цей маршрут завантаження.
Додаток
<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')
Оболонка
<div>
<header>
<nav>...</nav>
</header>
<main>
<slot></slot>
</main>
</div>
Головна сторінка
<section>
<form>...</form>
</section>
{
methods: {
onSubmit() {
// ...
this.$router.push('/results')
}
}
}
Сторінка результатів
<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
}
})
}
}
}
Компонент результатів
В основному такий самий компонент результатів у вас вже є, але якщо loading
це правда, або якщо results
це нуль, однак ви віддаєте перевагу, ви можете створити підроблений набір даних, щоб повторити і створити версії скелетів, якщо хочете. В іншому випадку ви можете просто зберігати речі так, як у вас є.
this.$router.replace({path: "/results/xxxx"})