Spec-Zone.ru › Vue Router 3

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

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

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

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

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

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

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

Spec-Zone.ru

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