Đây là một cuộc gọi khó khăn xem xét chúng tôi biết rất ít về những gì xảy ra trong tuyến đường tải của bạn.
Nhưng...
Tôi chưa bao giờ có nhu cầu xây dựng tuyến tải, chỉ bao giờ tải (các) thành phần được hiển thị trên nhiều tuyến trong giai đoạn thu thập dữ liệu / init.
Một lập luận cho việc không có lộ trình tải là người dùng có khả năng điều hướng trực tiếp tới URL này (vô tình) và sau đó có vẻ như nó sẽ không có đủ ngữ cảnh để biết nơi gửi người dùng hoặc phải thực hiện hành động nào. Mặc dù điều này có thể có nghĩa là nó rơi vào một tuyến lỗi vào thời điểm này. Nhìn chung, không phải là một kinh nghiệm tuyệt vời.
Một điều nữa là nếu bạn đơn giản hóa các tuyến đường của mình, việc điều hướng giữa các tuyến đường trở nên đơn giản hơn nhiều và hoạt động như mong đợi / mong muốn mà không cần sử dụng $router.replace
.
Tôi hiểu điều này không giải quyết được câu hỏi theo cách bạn hỏi. Nhưng tôi khuyên bạn nên xem xét lại tuyến đường tải này.
Ứng dụng
<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')
Vỏ
<div>
<header>
<nav>...</nav>
</header>
<main>
<slot></slot>
</main>
</div>
Trang chính
<section>
<form>...</form>
</section>
{
methods: {
onSubmit() {
// ...
this.$router.push('/results')
}
}
}
Trang kết quả
<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
}
})
}
}
}
Thành phần kết quả
Về cơ bản chính là thành phần kết quả chính xác mà bạn đã có, nhưng nếu loading
là đúng hoặc nếu results
không, tuy nhiên bạn thích, bạn có thể tạo một tập dữ liệu giả để lặp lại và tạo các phiên bản khung xương, nếu bạn muốn. Nếu không, bạn chỉ có thể giữ mọi thứ theo cách bạn có nó.
this.$router.replace({path: "/results/xxxx"})