Получение данных
Иногда необходимо получить данные с сервера при активации маршрута. Например, перед отображением профиля пользователя нужно получить данные пользователя с сервера. Это можно сделать двумя способами:
Получение данных после навигации: сначала выполняется навигация, а получение данных происходит в цикле жизни входящего компонента. При получении данных отображается состояние загрузки.
Получение данных перед навигацией: данные извлекаются перед навигацией в страже входа на маршрут, а навигация выполняется после получения данных.
Технически оба варианта допустимы — в конечном счёте выбор зависит от того, какой пользовательский опыт вы хотите обеспечить.
Получение данных после навигации
При использовании этого подхода мы сразу переходим и отображаем входящий компонент, а получение данных происходит в методе 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 () {
// fetch the data when the view is created and the data is
// already being observed
this.fetchData()
},
watch: {
// call again the method if the route changes
'$route': 'fetchData'
},
methods: {
fetchData () {
this.error = this.post = null
this.loading = true
const fetchedId = this.$route.params.id
// replace `getPost` with your data fetching util / API wrapper
getPost(fetchedId, (err, post) => {
// make sure this request is the last one we did, discard otherwise
if (this.$route.params.id !== fetchedId) return
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.
beforeRouteUpdate (to, from, next) {
this.post = null
getPost(to.params.id, (err, post) => {
this.setData(err, post)
next()
})
},
methods: {
setData (err, post) {
if (err) {
this.error = err.toString()
} else {
this.post = post
}
}
}
}
Пользователь останется на предыдущем представлении, пока ресурс не будет получен для входящего представления. Поэтому рекомендуется отобразить индикатор прогресса или какой-либо индикатор во время получения данных. Если получение данных завершится ошибкой, необходимо отобразить сообщение об ошибке.
© 2013–present Evan You
Licensed under the MIT License.
https://router.vuejs.org/guide/advanced/data-fetching.html