更新時間:2022-05-31 09:17:25 來源:動力節點 瀏覽3139次
有時您需要在激活路由時從服務器獲取數據。例如,在呈現用戶配置文件之前,您需要從服務器獲取用戶數據。我們可以通過兩種不同的方式實現這一點:
首先執行導航,并在傳入組件的生命周期鉤子中獲取數據。在獲取數據時顯示加載狀態。
Fetching Before Navigation : 在路由進入守衛中導航前獲取數據,獲取數據后進行導航。
從技術上講,兩者都是有效的選擇 - 它最終取決于您的目標用戶體驗。
導航后獲取#使用這種方法時,我們會立即導航和渲染傳入的組件,并在組件的created鉤子中獲取數據。它使我們有機會在通過網絡獲取數據時顯示加載狀態,并且我們還可以為每個視圖處理不同的加載。
假設我們有一個Post組件需要根據以下內容獲取帖子的數據$route.params.id:
<template>
<div class="post">
<div v-if="loading" class="loading">Loading...</div>
<div v-if="error" class="error">{{ error }}</div>
<div v-if="post" class="content">
<h2>{{ post.title }}</h2>
<p>{{ post.body }}</p>
</div>
</div>
</template>
export default {
data() {
return {
loading: false,
post: null,
error: null,
}
},
created() {
// watch the params of the route to fetch the data again
this.$watch(
() => this.$route.params,
() => {
this.fetchData()
},
// fetch the data when the view is created and the data is
// already being observed
{ immediate: true }
)
},
methods: {
fetchData() {
this.error = this.post = null
this.loading = true
// replace `getPost` with your data fetching util / API wrapper
getPost(this.$route.params.id, (err, post) => {
this.loading = false
if (err) {
this.error = err.toString()
} else {
this.post = post
}
})
},
},
}
通過這種方法,我們在實際導航到新路線之前獲取數據。我們可以beforeRouteEnter在傳入組件的守衛中執行數據獲取,并且僅next在獲取完成時調用:
export default {
data() {
return {
post: null,
error: null,
}
},
beforeRouteEnter(to, from, next) {
getPost(to.params.id, (err, post) => {
next(vm => vm.setData(err, post))
})
},
// when route changes and this component is already rendered,
// the logic will be slightly different.
async beforeRouteUpdate(to, from) {
this.post = null
try {
this.post = await getPost(to.params.id)
} catch (error) {
this.error = error.toString()
}
},
}
在為傳入視圖獲取資源時,用戶將停留在前一個視圖上。因此,建議在獲取數據時顯示進度條或某種指示器。如果數據獲取失敗,還需要顯示某種全局警告消息。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習