В этом руководстве объясняется, как легко реализовать службу автозаполнения мест, предоставляемую Google Maps API, в vue js.

Посмотрите это видео для демонстрации

ПРИМЕЧАНИЕ: картинка необычная, потому что я использую VUETIFY. В этом руководстве просто объясняется, как работает API Google Адресов, без CSS 😐

Все, что нам нужно, это компонент vue и плагин под названием vue-meta (я уже использую его для SEO).

Сначала создадим файл под названием Places.vue.

// Places.vue
<template>
  <div>
    
    <input type="text" v-model="location">
    
    <ul>
      <li v-for="(result, i) in searchResults" :key="i">
        {{ result }} // list of all places
      </li>
    </ul>
  </div>
</template>

Теперь добавьте тег скрипта в тот же файл и добавьте следующее -

// Places.vue
<script>
  export default {
    data: () => ({
      location: '',
      searchResults: [],
      service: null // will reveal this later 🕵️
    })
  }
</script>

Установите плагин vue-meta - документация очень проста и плагин устанавливается как любой другой плагин vue.

Размещение обработчика metaInfo в Places.vue -

// Places.vue
<script>
  export default {
    data, // already wrote above
    metaInfo () {
      return {
        script: [{
          src: `https://maps.googleapis.com/maps/api/js?key=<YOUR_API_KEY>&libraries=places`,
          async: true,
          defer: true,
          callback: () => this.MapsInit() // will declare it in methods
        }]
      }
    }
  }
</script>

Поэтому я использовал здесь metaInfo потому, что мы можем -

  1. загружать внешние файлы JS на ходу, только когда компонент отрисован.
  2. Это дает нам возможности функции обратного вызова, вызываемой при загрузке файла JS! - 😎

Теперь давайте продолжим и создадим крючок для самых ожидаемых методов -

// Places.vue
<script>
  export default {
    data // defined already,
    metaInfo // defined already,
    methods: {
      MapsInit () {
        this.service = new window.google.maps.places.AutocompleteService()
      },
      displaySuggestions (predictions, status) {
        if (status !== window.google.maps.places.PlacesServiceStatus.OK) {
          this.searchResults = []
          return
        }
        this.searchResults = predictions.map(prediction => prediction.description) 
      }
    }
  }
</script>

Давайте посмотрим, что делают эти функции MapsInit и displaySuggestions.

MapInit () - функция, вызываемая при загрузке файла JS.

В этом случае мы используем службу Google Places под названием - AutocompleteService (не беспокойтесь прямо сейчас! Проверьте документацию Google, если вы не можете жить без нее 🤷 ).

мы назначаем эту AutocompleteService () нашему свойству данных «service», чтобы мы могли использовать его позже.

displaySuggestions (прогнозы, статус) - объяснил чуть позже.

И это последний кусок головоломки. Наблюдатель в свойстве location

// Places.vue
<script>
  export default {
    data // already defined,
    methods // already defined,
    metaInfo // already defined,
    // the magical part
    watch: {
      location (newValue) {
        if (newValue) {
          this.service.getPlacePredictions({
            input: this.location,
            types: ['(cities)']
          }, this.displaySuggestions)
        }
      }
    }
  }
</script>

Итак, все, что вы вводите в поле ввода, изменяет свойство location, и всякий раз, когда изменяется свойство location, вызывается функция getPlacePredictions, которая прикреплен к свойству service.

getPlacePredictions получает два параметра:

  1. Объект, у которого есть много вещей, но мы используем здесь только input и типы -
    a. input - запрос, который нужно предсказать ( this.locations в нашем случае).
    b. types- тип результата.
  2. функция обратного вызова, которую мы объявили выше в перехвате методов, - displaySuggestions.

Все сделано!

Если вам понравилось это читать и вы нашли его немного полезным,
Хотите купить мне кофе?