Vue.js 单文件组件中的 Mapbox-gl (Quasar-Framework)
Mapbox-gl in a Vue.js single file component (Quasar-Framework)
我想在 Quasar Framework (Vue) 单文件组件中实现 Mapbox-gl-js 地图,但我没有让它工作。我用 Vue 在 Googlemaps 上找到了一些代码,用 React 在 Mapbox 上找到了一些东西,并尝试将它们组合在一起。使用下面的地图初始化参数,我可以让地图在 index.html 中显示良好(使用 mapzen tiles),但希望它在组件中显示。
我试着按照这个 [https://laracasts.com/discuss/channels/vue/google-maps-and-vue-js](link url) 然后为 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>
顺便说一句,对于带有 webpack 的 mapbox,您需要某些加载程序,请参阅:
[https://mikewilliamson.wordpress.com/2016/02/24/using-mapbox-gl-and-webpack-together/](link url)
但是当我之前让 Mapbox 与 Webpack 一起工作时(没有 vue),我想我没问题。实际上我在浏览器控制台中没有收到任何错误(但显然没有地图出现)。
在 app.js 文件中,我不知道如何处理建议(可能没有必要,因为 googlemaps 需要回调,不知道 mapbox/mapzen?!):
var App = window.App = new Vue ({
//code
})
在 Quasar 中,初始化是这样完成的:
Quasar.start(() => {
Router.start(Vue.extend({}), '#quasar-app')
})
我不太明白...
欢迎提出任何如何实现此功能的建议!
我注意到的第一件事:您在 DOM 注入文档之前初始化地图。使用“ready()”代替“created()”方法。
我很接近。这确实有效:
<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 初始化。
Quasar 基于 Vue2 版本。所以 ready 方法已被弃用,所以不要使用 mounted 方法。
<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>
我想这可能会有所帮助!
我想在 Quasar Framework (Vue) 单文件组件中实现 Mapbox-gl-js 地图,但我没有让它工作。我用 Vue 在 Googlemaps 上找到了一些代码,用 React 在 Mapbox 上找到了一些东西,并尝试将它们组合在一起。使用下面的地图初始化参数,我可以让地图在 index.html 中显示良好(使用 mapzen tiles),但希望它在组件中显示。
我试着按照这个 [https://laracasts.com/discuss/channels/vue/google-maps-and-vue-js](link url) 然后为 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>
顺便说一句,对于带有 webpack 的 mapbox,您需要某些加载程序,请参阅: [https://mikewilliamson.wordpress.com/2016/02/24/using-mapbox-gl-and-webpack-together/](link url) 但是当我之前让 Mapbox 与 Webpack 一起工作时(没有 vue),我想我没问题。实际上我在浏览器控制台中没有收到任何错误(但显然没有地图出现)。
在 app.js 文件中,我不知道如何处理建议(可能没有必要,因为 googlemaps 需要回调,不知道 mapbox/mapzen?!):
var App = window.App = new Vue ({
//code
})
在 Quasar 中,初始化是这样完成的:
Quasar.start(() => {
Router.start(Vue.extend({}), '#quasar-app')
})
我不太明白...
欢迎提出任何如何实现此功能的建议!
我注意到的第一件事:您在 DOM 注入文档之前初始化地图。使用“ready()”代替“created()”方法。
我很接近。这确实有效:
<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 初始化。
Quasar 基于 Vue2 版本。所以 ready 方法已被弃用,所以不要使用 mounted 方法。
<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>
我想这可能会有所帮助!