Mapbox-gl в однофайловом компоненте Vue.js (Quasar-Framework)

Я хотел бы реализовать карту Mapbox-gl-js в однофайловом компоненте Quasar Framework (Vue), но у меня это не работает. Я нашел кое-какой код на Googlemaps с Vue и кое-что на Mapbox с React и попытался собрать его воедино. С приведенными ниже параметрами инициализации карты я могу получить карту, отображаемую в index.html (с плитками mapzen), но хочу, чтобы она была в компоненте.

Я стараюсь следовать этому [https://laracasts.com/discuss/channels/vue/google-maps-and-vue-js](ссылка), а затем настройте его для Mapbox: proj/src/components/maplayout.vue :

<template>
    <quasar-layout>
      <h3>Map</h3>
      <div id='map'></div>
    </quasar-layout>
  </template>

  <script>
  import mapboxgl from '../app'

  export default {
    data () {
      return {}
    },
    create () {
      this.createMap()
    },
    methods: {
      createMap: function () {
        mapboxgl.accessToken = '{{yourmapboxaccestokenkey}}'
        var simple = {
          'version': 8,
          'sources': {
            'osm': {
              'type': 'vector',
              'tiles': ['https://vector.mapzen.com/osm/all/{z}/{x}/{y}.mvt?api_key=vector-tiles-{{yourmapzenapikey}}']
            }
          },
          'layers': [{
            'id': 'background',
            'type': 'background',
            'paint': {
              'background-color': '#adddd2'
            }
          }, {
            'id': 'majorroad',
            'source': 'osm',
            'source-layer': 'roads',
            'type': 'line'
          }, {
            'id': 'buildings',
            'type': 'fill',
            'source': 'osm',
            'source-layer': 'buildings'
          }]
        }

        // initialize the map
        this.map = new mapboxgl.Map({
          container: 'map',
          style: simple,
          center: [-1.83, -78.183],
          zoom: 5.5
        })
      }
    }
  }
  </script>

  <style>
  </style>

Кстати, для mapbox с webpack нужны определенные загрузчики, см.: [https://mikewilliamson.wordpress.com/2016/02/24/using-mapbox-gl-and-webpack-together/](ссылка url) Но как я понял Mapbox работал с Webpack раньше (без vue), думаю, у меня все в порядке, на самом деле я не получаю никаких ошибок в консоли браузера (но, очевидно, карта не появляется).

В файле app.js я не знаю, как быть с предложенным (может быть, это и не нужно, так как googlemaps нужен обратный вызов, не знаю насчёт mapbox/mapzen?!):

var App = window.App = new Vue ({
//code
})

Как и в Квазаре инициализация делается так:

Quasar.start(() => {
  Router.start(Vue.extend({}), '#quasar-app')
})

Чего я совсем не понимаю...

Любые предложения, как заставить это работать, приветствуются!


person musicformellons    schedule 23.09.2016    source источник


Ответы (4)


Я был близко. Это действительно работает:

<template>
  <quasar-layout>
  <h3>Map</h3>
  <div id='map'></div>
  </quasar-layout>
</template>

<script>
import mapboxgl from 'mapbox-gl'
console.dir(mapboxgl)

export default {
  data () {
    return {}
  },
  ready () {
    this.createMap()
  },
  methods: {
    createMap: function () {
      mapboxgl.accessToken = '{{yourmapboxaccestokenkey}}'
      var simple = {
        'version': 8,
        'sources': {
          'osm': {
            'type': 'vector',
            'tiles': ['https://vector.mapzen.com/osm/all/{z}/{x}/{y}.mvt?api_key=vector-tiles-{{yourmapzenapikey}}']
          }
        },
        'layers': [{
          'id': 'background',
          'type': 'background',
          'paint': {
            'background-color': '#bbccd2'
          }
        },
          {
            'id': 'majorroad',
            'source': 'osm',
            'source-layer': 'roads',
            'type': 'line'
          },
          {
            'id': 'buildings',
            'type': 'fill',
            'source': 'osm',
            'source-layer': 'buildings'
          }]
      }

      // init the map
      this.map = new mapboxgl.Map({
        container: 'map',
        style: simple,
        minzoom: 1.3,
        center: [-74.0073, 40.7124], // Manhattan
        zoom: 16
      })

      this.map.addControl(new mapboxgl.Navigation())
    }
  }
}
</script>

<style>
</style>

Я не изменил инициализацию Vue.

person musicformellons    schedule 25.09.2016
comment
наличие this.createMap() внутри mount() будет более подходящим, чем ready() - person Anand; 11.12.2018

<template>
  <div class="hello">
    <div id='map'></div>
  </div>
</template>

<script>
import mapboxgl from 'mapbox-gl';

require('../node_modules/mapbox-gl/dist/mapbox-gl.css');

export default {
  name: 'HelloWorld',
  data() {
    return {
      apiKey: {{ your api key }},
    };
  },
  mounted() {
    this.createMap();
  },
  methods: {
    createMap() {
      mapboxgl.accessToken = this.apiKey;
      // init the map
      this.map = new mapboxgl.Map({
        container: 'map',
        style: 'mapbox://styles/mapbox/streets-v9',
        minzoom: 1.3,
        center: [-74.0073, 40.7124], // Manhattan
        zoom: 16,
      });

      this.map.addControl(new mapboxgl.Navigation());
    },
  },
};
</script>

Это может помочь, я думаю!

person Vinayak Kulkarni    schedule 18.01.2018

Первое, что я заметил: вы инициализируете карту до того, как DOM будет внедрен в документ. Вместо метода «created()» используйте «ready()».

person Razvan Stoenescu    schedule 23.09.2016
comment
Приятно получить ответ от самого основателя Quasar Framework! Я следую вашему предложению и получаю Uncaught TypeError: Cannot set property 'accessToken' of undefined. По-видимому, mapboxgl не определено. Я импортирую библиотеку mapbox-gl в app.js, а затем export default mapboxgl и импортирую ее в malayout.vue. - person musicformellons; 23.09.2016
comment
Проверьте, не определен ли mapboxgl и в app.js. Вы делаете манипуляции с mapboxgl в app.js? Если нет, импортируйте его прямо в макет, а не проксируйте через app.js. У вас есть репо, на которое я могу взглянуть? - person Razvan Stoenescu; 24.09.2016
comment
После правильного импорта объекта mapboxgl я получаю: Uncaught Error: webworkify-webpack: Не удалось найти модуль, содержащий рабочую функцию! Убедитесь, что вы не используете исходные карты eval и что вы передаете именованные функции в webworkify-webpack! Проблема находится в следующем репо: github.com/musicformellons/mapcomponent - person musicformellons; 24.09.2016
comment
Я изменил конфигурацию веб-пакета: devtool: '#cheap-source-map', и ошибка выше устранена. Карта почти отображается (получил зеленый холст карты), за исключением того, что нет деталей карты ... Не уверен насчет части this.map, но когда просто делаю map, я получаю ошибки es-lint. - person musicformellons; 24.09.2016

Quasar основан на версии Vue2. Таким образом, готовый метод устарел, поэтому вместо этого используйте смонтированный метод.

person Kamal Nayak    schedule 25.01.2017
comment
Хотя это может быть ценным советом для решения проблемы, хороший ответ также демонстрирует решение. Пожалуйста, EDIT, чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы, рассмотрите возможность написания этого в качестве комментария. - person ρяσѕρєя K; 25.01.2017