Vue結(jié)合高德地圖實(shí)現(xiàn)HTML寫自定義信息彈窗全過(guò)程
最近在寫項(xiàng)目的時(shí)候有個(gè)需求就是根據(jù)點(diǎn)擊地圖上的點(diǎn)展示對(duì)應(yīng)的信息,彈窗看著還挺花哨的。我在高德地圖官網(wǎng)上還有各大平臺(tái)找了如何自定義彈窗,可給出的大多數(shù)都是通過(guò)JS寫HTML結(jié)構(gòu),我感覺(jué)這種不僅不好布局,而且可讀性和維護(hù)性都不如直接寫HTML好。于是我就在想,能不能在HTML里寫這個(gè)彈窗呢?
答案是:能!
效果圖如下:

先說(shuō)下思路吧,通過(guò)看高德地圖官方文檔關(guān)于InfoWindow的介紹,可以看出信息彈窗的顯示內(nèi)容,可以是HTML要素字符串或者HTMLElement對(duì)象。于是我就想到了在Vue里不是可以通過(guò)this.$refs獲取元素的DOM節(jié)點(diǎn)嗎?然后我就開始了第一次嘗試。

先看下后臺(tái)返回的數(shù)據(jù)類型:
data: [
{
id: '1', //id
projectName: 'xxxx項(xiàng)目', //項(xiàng)目名稱
address: '山東省濟(jì)南市市中區(qū)xxxxxxxxxx', //項(xiàng)目地址
sketchMapUrl: '116.998232,36.651352', //項(xiàng)目坐標(biāo)
startDate: '2022-06-18', //計(jì)劃開始日期
completedDate: '2022-11-18', //計(jì)劃結(jié)束日期
progress: '78', //施工進(jìn)度
buildPeople: '32', //施工人員
alarmNum: '8' //告警信息數(shù)目
},{
id: '2', //id
projectName: 'xxxx項(xiàng)目', //項(xiàng)目名稱
address: '山東省濟(jì)南市市中區(qū)xxxxxxxxxx', //項(xiàng)目地址
sketchMapUrl: '116.998232,36.651352', //項(xiàng)目坐標(biāo)
startDate: '2022-06-18', //計(jì)劃開始日期
completedDate: '2022-11-18', //計(jì)劃結(jié)束日期
progress: '78', //施工進(jìn)度
buildPeople: '32', //施工人員
alarmNum: '8' //告警信息數(shù)目
}
],
我一看這種數(shù)據(jù)類型不就是用v-for嗎?但是這個(gè)時(shí)候問(wèn)題來(lái)了,不能直接循環(huán)后臺(tái)返回的數(shù)據(jù)!
原因有二:
- 高德地圖的AMap.InfoWindow的content屬性不支持多個(gè)DOM根節(jié)點(diǎn)
- 不知道用戶點(diǎn)擊的哪一個(gè)點(diǎn)
必須經(jīng)過(guò)篩選,判斷用戶點(diǎn)擊的點(diǎn).
this.data.map((item) => {
this.arr = item.sketchMapUrl.split(',')
//自定義點(diǎn)圖標(biāo)
this.marker = new AMap.Marker({
map: this.map,
icon: this.icon,
position: [this.arr[0], this.arr[1]],
offset: new AMap.Pixel(-13, -30),
//注意,我這里判斷是給點(diǎn)加了個(gè)額外的參數(shù),就是數(shù)據(jù)的id
extData: item.id
})
this.marker.on('click', (e) => {
this.singleData = []
//這里通過(guò)e.target._opts.extData和item.id進(jìn)行比對(duì),如果相同則把這項(xiàng)點(diǎn)的信息單獨(dú)放一個(gè)數(shù)組里去遍歷,就是html里的遍歷數(shù)組
if (e.target._opts.extData === item.id) {
this.singleData.push(item)
}
this.infoWindow.open(this.map, e.target.getPosition())
})
})
這個(gè)時(shí)候可以判斷點(diǎn)擊的點(diǎn)了,下一步要做的就是實(shí)現(xiàn)自定義彈窗了。
代碼如下:
<template>
<div class="web-box">
<!-- 地圖 -->
<div id="map"></div>
<!-- 地圖彈窗 -->
<div ref="infoWindow" class="infoWindow" >
<div class="container" v-for="(item,index) in singleData" :key="index">
<!-- 這里面寫彈窗布局樣式 -->
</div>
</div>
</template>
js代碼:
//自定義信息窗體
this.infoWindow = new AMap.InfoWindow({
isCustom: true,
autoMove: true,
avoid: [20, 20, 20, 20],
content: this.$refs.infoWindow,
closeWhenClickMap: true,
offset: new AMap.Pixel(16, -30)
})
通過(guò)this.$refs.infoWindow拿到在HTML里寫的彈窗節(jié)點(diǎn),放在content內(nèi),這樣我們就可以不用再寫一些innerHTML和appendChild此類的代碼了!
總結(jié)
到此這篇關(guān)于Vue結(jié)合高德地圖實(shí)現(xiàn)HTML寫自定義信息彈窗的文章就介紹到這了,更多相關(guān)Vue自定義信息彈窗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目本地開發(fā)使用Nginx配置代理后端接口問(wèn)題
這篇文章主要介紹了vue項(xiàng)目本地開發(fā)使用Nginx配置代理后端接口問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Vue-Element-Admin集成自己的接口實(shí)現(xiàn)登錄跳轉(zhuǎn)
關(guān)于這個(gè)Vue-element-admin中的流程可能對(duì)于新的同學(xué)不是很友好,所以本文將結(jié)合實(shí)例代碼,介紹Vue-Element-Admin集成自己的接口實(shí)現(xiàn)登錄跳轉(zhuǎn),感興趣的小伙伴們可以參考一下2021-06-06
Vue Element如何獲取select選擇框選擇的value和label
文章介紹了兩種使用Vue.js和ElementUI獲取select選擇框值的方法:一種是使用watch監(jiān)聽(tīng)selectedValue的變化,另一種是使用@change事件,兩種方法都能實(shí)現(xiàn)獲取選擇的value和label2025-01-01
vue頁(yè)面設(shè)置滾動(dòng)失敗的完美解決方案(scrollTop一直為0)
這篇文章主要介紹了vue頁(yè)面設(shè)置滾動(dòng)失敗的解決方案(scrollTop一直為0),本文通過(guò)場(chǎng)景分析實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05
vue+el-element中根據(jù)文件名動(dòng)態(tài)創(chuàng)建dialog的方法實(shí)踐
本文主要介紹了vue+el-element中根據(jù)文件名動(dòng)態(tài)創(chuàng)建dialog的方法實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12

