Как использовать Async/Await с компонентами Vue.js

Поначалу может быть непонятно, как разобраться с однофайловыми шаблонами Vue и как использовать функции javascript, которые вы знаете.

Хук created

Созданный хук - это хук жизненного цикла, метод, который вызывается при первом создании шаблона, но до его монтирования.

Объявляем метод created() как асинхронный и выполняем асинхронные действия внутри него. В этом примере мы загружаем список пользователей:

export default {

  data () {
    return {
      users: null
    }
  },

  async created () {
    const response = await fetch("https://reqres.in/api/users")
    const { data: users } = await response.json()
    this.users = users
  }

}

Хук mounted

Хук mounted почти идентичен хуку created, но срабатывает после того, как компонент был установлен (добавлен в DOM). Созданный хук обычно предпочтительнее для вызовов API.

Как и выше, мы можем просто сделать метод mounted () асинхронным.

export default {

  data () {
    return {
      users: null
    }
  },

  async mounted () {
    const response = await fetch("https://reqres.in/api/users")
    const { data: users } = await response.json()
    this.users = users
  }

}

Методы

Vue позволяет любому методу быть асинхронным методом. Вот пример с данными, запрашиваемыми при нажатии на кнопку.

<button @click="loadUsers">Load Users</button>
<div v-if="users">{{ users }}</div>
export default {

  data () {
    return {
      users: null
    }
  },

  methods: {
    async loadUsers () {
      const response = await fetch("https://reqres.in/api/users")
      const { data: users } = await response.json()
      this.users = users
    }
  }

}

Computed свойства

Вычисляемые свойства являются исключением, Vue не позволяет им быть асинхронными. Есть способы обойти это ограничение, например, плагин vue-async-computed, но это не лучшая практика.

Если нужно асинхронное вычисляемое свойство, то, скорее всего, допущена архитектурная ошибка в компоненте. С опытом становится привычно работать с вычисляемыми свойствами, как с чисто синхронными функциями. Все асинхронные операции должны выполняться в методах.

Если все ещё нужно асинхронное вычисляемое свойство, попробуйте вместо него использовать наблюдатель (watchers).

Watchers (наблюдатели)

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

Вот пример, в котором вычисляемый параметр возвращает количество пользователей. Watcher перезагружает список пользователей, как только фильтр userRoles изменяется.

export default {

  data () {
    return {
      userRoles: ['admin'],
      users: [...]
    }
  },

  watch: {
    async userRoles (newRoles) {
      const query = JSON.stringify(newRoles)
      const response = await fetch(`https://reqres.in/api/users?roles=${query}`)
      const { data: users } = await response.json()
      this.users = users
    }
  },

  computed: {
    userCount () {
      return this.users.length
    }
  }

}
Написать комментарий