Vue結(jié)合高德地圖實(shí)現(xiàn)HTML寫自定義信息彈窗全過程
最近在寫項(xiàng)目的時(shí)候有個(gè)需求就是根據(jù)點(diǎn)擊地圖上的點(diǎn)展示對應(yīng)的信息,彈窗看著還挺花哨的。我在高德地圖官網(wǎng)上還有各大平臺找了如何自定義彈窗,可給出的大多數(shù)都是通過JS寫HTML結(jié)構(gòu),我感覺這種不僅不好布局,而且可讀性和維護(hù)性都不如直接寫HTML好。于是我就在想,能不能在HTML里寫這個(gè)彈窗呢?
答案是:能!
效果圖如下:
先說下思路吧,通過看高德地圖官方文檔關(guān)于InfoWindow的介紹,可以看出信息彈窗的顯示內(nèi)容,可以是HTML要素字符串或者HTMLElement對象。于是我就想到了在Vue里不是可以通過this.$refs
獲取元素的DOM節(jié)點(diǎn)嗎?然后我就開始了第一次嘗試。
先看下后臺返回的數(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í)候問題來了,不能直接循環(huán)后臺返回的數(shù)據(jù)!
原因有二:
- 高德地圖的AMap.InfoWindow的content屬性不支持多個(gè)DOM根節(jié)點(diǎn)
- 不知道用戶點(diǎn)擊的哪一個(gè)點(diǎn)
必須經(jīng)過篩選,判斷用戶點(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 = [] //這里通過e.target._opts.extData和item.id進(jìn)行比對,如果相同則把這項(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) })
通過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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue Element前端應(yīng)用開發(fā)之常規(guī)Element界面組件
在我們開發(fā)BS頁面的時(shí)候,往往需要了解常規(guī)界面組件的使用,小到最普通的單文本輸入框、多文本框、下拉列表,以及按鈕、圖片展示、彈出對話框、表單處理、條碼二維碼等等,本篇隨筆基于普通表格業(yè)務(wù)的展示錄入的場景介紹這些常規(guī)Element組件的使用2021-05-05vue2+elementui上傳照片方式(el-upload超簡單)
這篇文章主要介紹了vue2+elementui上傳照片方式(el-upload超簡單),具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue路由傳遞參數(shù)與重定向的使用方法總結(jié)
路由的本質(zhì)就是一種對應(yīng)關(guān)系,比如說我們在url地址中輸入我們要訪問的url地址之后,瀏覽器要去請求這個(gè)url地址對應(yīng)的資源,下面這篇文章主要給大家介紹了關(guān)于Vue路由傳遞參數(shù)與重定向的使用方法,需要的朋友可以參考下2022-10-10Vue后臺中優(yōu)雅書寫狀態(tài)標(biāo)簽的方法實(shí)例
在Vue中,我們可以非常便捷地通過標(biāo)簽實(shí)現(xiàn)狀態(tài)的保存,這篇文章主要給大家介紹了關(guān)于Vue后臺中如何優(yōu)雅的書寫狀態(tài)標(biāo)簽的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-08-08詳解Vue+elementUI build打包部署后字體圖標(biāo)丟失問題
這篇文章主要介紹了詳解Vue+elementUI build打包部署后字體圖標(biāo)丟失問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Vue路由之JWT身份認(rèn)證的實(shí)現(xiàn)方法
這篇文章主要介紹了Vue路由之JWT身份認(rèn)證的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08