一、需要注意的是,不能在点聚合的标签上使用 v-for 否则点聚合无效,所以在点聚合标签下定义一个 div 如代码所示,图标也可以自定义,具体看代码注释
1 <template> 2 <div class="mapbox"> 3 <baidu-map 4 class="map" 5 @ready="handler" 6 center="中国" 7 :map-click="false"> 8 <bml-marker-clusterer 9 :averageCenter="true" 10 > 11 <div 12 v-for="(marker, i) of markers" 13 :key="i"> 14 <bm-marker 15 :dragging="true" 16 animation="BMAP_ANIMATION_BOUNCE" 17 :icon="{url: marker.url, size: { 300, height: 171 }}" 18 :position="{lng: marker.lng, lat: marker.lat}" 19 @click="infoWindowOpen(marker)" 20 > 21 <bm-info-window 22 title="弹窗信息" 23 :position="{lng: marker.lng, lat: marker.lat}" 24 :show="marker.showFlag" 25 @close="infoWindowClose(marker)" 26 @open="infoWindowOpen(marker)" 27 > 28 <p>123456789</p> 29 <p>123456789</p> 30 <p>123456789</p> 31 <p>123456789</p> 32 <p>123456789</p> 33 </bm-info-window> 34 </bm-marker> 35 </div> 36 </bml-marker-clusterer> 37 </baidu-map> 38 </div> 39 </template> 40 41 <script> 42 // 按需引入点聚合 43 import { BmlMarkerClusterer } from 'vue-baidu-map' 44 // 引入marker 45 import BmMarker from 'vue-baidu-map/components/overlays/Marker' 46 47 // 插入 100 个随机点 48 const markers = [] 49 for (let i = 0; i < 100; i++) { 50 const position = { lng: Math.random() * 40 + 85, lat: Math.random() * 30 + 21, url: 'http://developer.baidu.com/map/jsdemo/img/fox.gif', showFlag: false } 51 const position1 = { lng: Math.random() * 40 + 85, lat: Math.random() * 30 + 21, url: 'https://cdn.tipe.io/tipe/tipe-cat-no-text.svg', showFlag: false } 52 if (i % 2 === 0) { 53 markers.push(position) 54 } else { 55 markers.push(position1) 56 } 57 } 58 const carList = [ 59 {} 60 ] 61 export default { 62 name: 'Bmaptrace', 63 components: { 64 BmlMarkerClusterer, 65 BmMarker 66 }, 67 data () { 68 return { 69 BMap: '', 70 map: '', 71 markers, 72 carList, 73 show: false 74 } 75 }, 76 methods: { 77 handler ({ BMap, map }) { 78 map.enableScrollWheelZoom(true) 79 // map.centerAndZoom('青岛市', 13) 80 // 赋值,方便调用,本节没用到 81 this.BMap = BMap 82 this.map = map 83 }, 84 // 关闭信息窗口 @close 自带的方法 85 infoWindowClose (marker) { 86 marker.showFlag = false 87 console.log(marker) 88 }, 89 // 首先点击marker时开启信息窗口,其实没必要在 bm-info-window 上写 @open 因为如果是关闭状态根本就点不到,所以就无法触发 @open 90 // 如果在 bm-info-window 上写了 @open 在点击marker时会触发两次infoWindowOpen函数,而且可以很明显的看到有延时 91 infoWindowOpen (marker) { 92 marker.showFlag = true 93 console.log(marker) 94 } 95 } 96 } 97 </script> 98 <style scoped> 99 .map { 100 height:800px; 101 } 102 </style>
效果如图所示