VueJS, ReferenceError: Google не определен

У меня есть следующий исходный код, и я также получил следующую ошибку, когда пытаюсь создать новую переменную с помощью google.maps ...:

google' is not defined

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

PS: я использую это в main.js

Vue.use(VueGoogleMaps, {    
  load: {    
    key: 'MY-KEY',    
    libraries: 'places', //// If you need to use place input    
  },    
})     

Может кто-нибудь помочь мне? Спасибо.

<div class = "map-container">     
       <gmap-map     
         id = "map"     
         ref = "map"     
         :center = "center"     
         :zoom = "15"     
         map-type-id = "roadmap"     
         style = "width:100%;  height: 400px;">     
           <gmap-marker     
           :key = "index"    
            v-for = "(m, index) in markers"    
            :position = "m.position"    
             @click = "center=m.position"    
             ></gmap-marker>    
                </gmap-map>
            </div>
<script>    
    import _ from 'lodash'    
    import { mapState } from 'vuex'    
    import * as VueGoogleMaps from 'vue2-google-maps'   

    export default {    
      computed: {    
        ...mapState([    
          'map',    
        ]),    
        mapStyle: function () {     
          const h = document.body.clientHeight - 80    
          return 'width: 100%; height: ' + h + 'px'    
        },    
        center: function () {    
          return { lat: 44.837938, lng: -0.579174 }    
        },    
      },    
      mounted: function () {    
        VueGoogleMaps.loaded.then(() => {
           var map = new google.maps.Map(document.getElementById('map'))    
        }
      }, 

Изучив часть исходного кода, я понял, что плагин не предоставляет API и использует google как глобальный, поэтому он ожидает, что он будет загружен вне библиотеки. Возможно, вы сможете заставить его работать, если используете window.google, но только если эта библиотека загружается отдельно.

Daniel 21.02.2019 21:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
1
12 377
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы забыли одну скобку:

VueGoogleMaps.loaded.then(() => {
           var map = new google.maps.Map(document.getElementById('map'))    
        })

Скажи мне, если это поможет.


Также из NPM vue2-google-карты,

If you need to gain access to the google object:

<template>
  <GmapMarker ref = "myMarker"
    :position = "google && new google.maps.LatLng(1.38, 103.8)" />
</template>
<script>
import {gmapApi} from 'vue2-google-maps'

export default {
  computed: {
    google: gmapApi
  }
}
</script>

Это не помогает его проблеме. Я опубликовал аналогичный ответ и удалил его, так как он не решил проблему.

Constantin Chirila 21.02.2019 12:48

Отредактировал мой пост: не хватает одной скобки. У меня это работает в CodeSandbox.

charlycou 21.02.2019 14:12

@charlycou да, я использовал ответ "Matthias S", чтобы решить проблему

Smix 26.09.2019 16:28
Ответ принят как подходящий

Поскольку вы импортировали все как VueGoogleMaps, я бы предположил, что google находится внутри этого объекта.

Обновлено: кажется, что объект google называется gmapApi.

Так изменить

var map = new google.maps.Map(document.getElementById('map'))   

к

let map = new VueGoogleMaps.gmapApi.maps.Map(document.getElementById('map'))   

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

Так

computed: {
    google: VueGoogleMaps.gmapApi
}

Похоже, вы можете ссылаться на информацию из vue-google-maps. Не похоже, что у vue2-google-maps есть API

Daniel 21.02.2019 21:04

Если вы получаете "карты нуля", это означает, что вычисляемое свойство Google еще не готово.

Попробуй это:

computed: {
    google: VueGoogleMaps.gmapApi
}
...

Внутри вашего метода ждать gmapApi:

this.$gmapApiPromiseLazy().then(() => {
  //your code here
  //E.g. for directions
  var directionsService = new this.google.maps.DirectionsService();
});

Другие вопросы по теме