Appearance
Base map
Adding map component
For using maps with Mapbox GL JS you need a map style. If you using Mapbox-hosted maps, you need to set access_token
. Look for details in Mapbox documentation. If you using self-hosting maps on your own server you can omit this parameter.
vue
<template>
<VMap :accessToken="accessToken" :mapStyle="mapStyle" />
</template>
<script>
import 'mapbox-gl/dist/mapbox-gl.css'
import mapbox from "mapbox-gl";
import { VMap } from "v-mapbox";
export default {
components: {
VMap
},
data() {
return {
accessToken: ACCESS_TOKEN, // your access token. Needed if you using Mapbox maps
mapStyle: MAP_STYLE // your map style
};
},
created() {
// We need to set mapbox-gl library here in order to use it in template
this.mapbox = mapbox;
}
};
</script>
TIP
If you need, you can pass Mapbox-gl-js implementation as mapboxGl
prop. May be useful for lazy-loading. Example:
vue
<template>
<VMap
:mapbox-gl="mapbox-gl"
:access-token="accessToken"
:map-style.sync="mapStyle"
@load="onMapLoaded"
/>
</template>
If none is passed, VueMapbox imports Mapbox-gl internally.
Interact with map properties as GlMap props
You can control map parameters like zoom, bearing, pitch etc. by changing props. If you set .sync
modifier (Vue docs) to prop, it will updates when you use operations that takes time to proceed. For example, if you use flyTo
method, props zoom
, center
, bearing
, pitch
will be updated when animation ends.
Full list of props see in API docs, note field 'Synced' in description
Map loading
When map loads, VMap
component emits load
event. Payload of the event contains Mapbox GL JS Map
object. All components placed under VMap
will be rendered only after map fully loaded.
Storing Map object
Take note that it's generally bad idea to add to Vuex or component's data
anything but primitive types and plain objects. Vue adds getters and setters to every property, so if you add Map
object to Vuex store or component data
, it may lead to weird bugs. If you want to store map object, store it as non-reactive property like in example below.
vue
<template>
<VMap
:access-token="accessToken"
:map-style.sync="mapStyle"
@load="onMapLoaded"
/>
</template>
<script>
export default {
// …component code…
created() {
this.map = null;
},
methods: {
onMapLoaded(event) {
// in component
this.map = event.map;
// or just to store if you want have access from other components
this.$store.map = event.map;
}
}
};
</script>
Map actions
Asynchronous map methods exposed at VMap component in actions
property. They returns Promise
, that resolves when action completed. Promise resolves with map properties that has been changed by used action. For example:
vue
<script>
export default {
name: 'App',
methods: {
async onMapLoad(event) {
// Here we cathing 'load' map event
const asyncActions = event.component.actions
const newParams = await asyncActions.flyTo({
center: [30, 30],
zoom: 9,
speed: 1
})
console.log(newParams)
/* => {
center: [30, 30],
zoom: 9,
bearing: 9,
pitch: 7
}
*/
}
}
}
</script>
See full list of actions on API page.
Method actions.stop()
Method .stop()
just stops all animations on map, updates props with new positions and return Promise with map parameters at the moment when .stop()
called.
Events
See list of events on API page.