Это сложный вызов, учитывая, как мало мы знаем о том, что происходит на вашем маршруте погрузки.
Но...
У меня никогда не было необходимости строить маршрут загрузки, только когда загружались компоненты, которые отображаются на нескольких маршрутах на этапе инициализации / сбора данных.
Одним из аргументов в пользу отсутствия маршрута загрузки может быть то, что пользователь потенциально может перейти непосредственно к этому 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
равен true или results
имеет значение null, как вы предпочитаете, вы можете создать поддельный набор данных для перебора и создания версий скелета, если хотите. В противном случае вы можете просто оставить все как есть.
this.$router.replace({path: "/results/xxxx"})