Получение данных
Иногда вам нужно получить данные с сервера при активации маршрута. Например, перед отображением профиля пользователя необходимо получить данные пользователя с сервера. Это можно сделать двумя способами:
Получение данных после навигации: сначала выполните навигацию, а затем получите данные в методе жизненного цикла входящего компонента. Отобразите состояние загрузки, пока данные загружаются.
Получение данных перед навигацией: получите данные перед навигацией в защитнике входа маршрута и выполните навигацию после получения данных.
Технически оба варианта являются допустимыми — в конечном итоге выбор зависит от того, какое пользовательское взаимодействие вы хотите обеспечить.
Получение данных после навигации
При использовании этого подхода мы сразу переходим и отображаем входящий компонент, а данные получаем в методе жизненного цикла компонента 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()
}
},
}
Пользователь останется на предыдущем представлении, пока ресурс не будет получен для входящего представления. Поэтому рекомендуется отображать индикатор прогресса или какой-либо индикатор, пока данные загружаются. Если загрузка данных завершится неудачно, необходимо отобразить сообщение об ошибке.
© 2013–present Evan You
Licensed under the MIT License.
https://next.router.vuejs.org/guide/advanced/data-fetching