本文记录vue2用renderjs使用mapbox的写法;
本人通常单独写个组件,再加上控制显隐的,利用:change:params
和this.$ownerInstance.callMethod('functionName')
传参;
有别的写法但是没搞懂,其他欢迎大佬们补充~
直接看:
‘
<template>
<view
id="map-box"
style="width: 100%;height: 100%;"
:mapShow="mapShow"
:change:mapShow="mapbox.handleMapShow"
:userLocation="userLocation"
:change:userLocation="mapbox.handleUserLocation"
></view>
</template>
<script>
export default {
data() {
return {
mapShow: false,
userLocation: [],
mapLoaded: false,
};
},
methods: {
changeMapLoaded(val) {
this.mapLoaded = val;
... // 其他处理
}
}
}
</script>
<script module="mapbox" lang="renderjs">
// import * as turf from '@turf/turf';
// import _ from 'lodash';
// import MapboxLanguage from '@mapbox/mapbox-gl-language';
import mapboxgl from 'mapbox-gl/dist/mapbox-gl.js';
let mapShow = false; // 是否展示地图
let map = null; // 地图实例
let mapLoaded = false; // 地图是否加载了
let center = [116.413467, 39.915156]; // 北京
// 业务上的数据存储
let userMarker = null;
let userLocation = [];
export default {
methods: {
handleMapShow(val) {
mapShow = val;
if (mapShow && !map) this.initMap();
},
initMap() {
mapboxgl.accessToken = '...'
map = new mapboxgl.Map({
container: 'map-box',
... // 初始化
})
// map.addControl(new MapboxLanguage({
// defaultLanguage: "zh-Hans"
// }));
map.on('load', () => {
mapLoaded = true;
this.$ownerInstance.callMethod('changeMapLoaded', true);
this.addUserMarker();
})
},
handleUserLocation(val) {
userLocation = val;
this.addUserMarker()
},
addUserMarker() {
if (!userLocation.length || !mapLoaded) return;
if (userMarker) userMarker.setLngLat(userLocation)
else {
const el = document.createElement('div');
el.className = 'marker_user';
userMarker = new mapboxgl.Marker({
anchor: 'bottom',
element: el
})
.setLngLat(userLocation)
.addTo(map);
}
},
}
}
</script>
<style lang="scss" scoped>
@import "mapbox-gl/dist/mapbox-gl.css";
.mapboxgl-ctrl-logo {
display: none !important;
}
::v-deep .mapboxgl-ctrl-logo {
display: none;
}
::v-deep .mapboxgl-ctrl-attrib-inner {
display: none;
}
::v-deep .mapboxgl-ctrl-attrib.mapboxgl-compact {
display: none;
}
::v-deep .marker_user {
... // 图标样式等
}
</style>