Spec-Zone.ru › Vue Router 4

Получение данных

Иногда вам нужно получить данные с сервера при активации маршрута. Например, перед отображением профиля пользователя необходимо получить данные пользователя с сервера. Это можно сделать двумя способами:

  • Получение данных после навигации: сначала выполните навигацию, а затем получите данные в методе жизненного цикла входящего компонента. Отобразите состояние загрузки, пока данные загружаются.

  • Получение данных перед навигацией: получите данные перед навигацией в защитнике входа маршрута и выполните навигацию после получения данных.

Технически оба варианта являются допустимыми — в конечном итоге выбор зависит от того, какое пользовательское взаимодействие вы хотите обеспечить.

Получение данных после навигации

При использовании этого подхода мы сразу переходим и отображаем входящий компонент, а данные получаем в методе жизненного цикла компонента 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()
    }
  },
}

Пользователь останется на предыдущем представлении, пока ресурс не будет получен для входящего представления. Поэтому рекомендуется отображать индикатор прогресса или какой-либо индикатор, пока данные загружаются. Если загрузка данных завершится неудачно, необходимо отобразить сообщение об ошибке.

Предложить изменения на этой странице
Поля метаданных маршрута
API композиции

© 2013–present Evan You
Licensed under the MIT License.
https://next.router.vuejs.org/guide/advanced/data-fetching

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API