nuxt使用antv-l7踩坑

nuxt.js 下使用 antv-l7 實(shí)在是有太多的坑了蔗喂,官方文檔也不是很全,只能不斷摸索和嘗試高帖,下面我把這些坑記錄下來(lái)缰儿,也許能幫到你。

這些解決方案不會(huì)是唯一解散址,也不見(jiàn)得是最優(yōu)解乖阵,但至少解決了我的問(wèn)題,而且還保留了代碼的相對(duì)整潔和高效预麸。如果你有更好的解決方案瞪浸,歡迎留言;如果未來(lái)官方修復(fù)了這些問(wèn)題吏祸,或者提供了更好的使用方法对蒲,那請(qǐng)忽略這篇文章。

nuxt 下只能通過(guò) plugin 的方式引入 l7

不能直接用 import { Scene } from '@antv/l7' 這樣的方法,在任何地方都不行蹈矮,會(huì)出現(xiàn) window undefined 的錯(cuò)誤

比較隱蔽的情況是砰逻,訪問(wèn) localhost:3000/ 等頁(yè)面是正常的,然后通過(guò)點(diǎn)擊菜單(即利用 Nuxt to 來(lái)完成跳轉(zhuǎn))泛鸟,那及時(shí)使用了 import 也一切正常蝠咆,但,這種時(shí)候北滥,這個(gè)頁(yè)面是不能被刷新的刚操,也不能直接訪問(wèn),否則一樣會(huì)出現(xiàn) window undefined 的錯(cuò)誤

解決方案就是和其他的 client only 組件一樣碑韵,通過(guò) plugin 的方式引入

plugins 目錄下新建 l7.js

import Vue from 'vue'

const l7 = require('@antv/l7')
const l7maps = require('@antv/l7-maps')

Vue.prototype.$l7 = l7
Vue.prototype.$l7maps = l7maps

并在 nuxt.config 中設(shè)置為僅 client 引入插件

plugins: [
    '@/plugins/fontawesome',
    { src: '@/plugins/g2', ssr: false }, // antv-g2 也是一樣
    { src: '@/plugins/l7', ssr: false },
  ],

使用時(shí)赡茸,利用 this.$l7 的方式使用

const { Scene, Popup } = this.$l7
const { GaodeMap, Mapbox } = this.$l7maps

地圖不能重復(fù)渲染缎脾,會(huì)卡死

這個(gè)坑出現(xiàn)的原因還沒(méi)有找到祝闻,懷疑是 antv-l7 這個(gè)庫(kù)在實(shí)現(xiàn)時(shí)有問(wèn)題,也可能是與 nuxt 的某種機(jī)制沖突遗菠,因?yàn)楹孟駟为?dú)用的時(shí)候是沒(méi)問(wèn)題的

問(wèn)題表現(xiàn)如下:假設(shè)有一個(gè)頁(yè)面联喘,叫做 map,其中有 2 個(gè)地圖辙纬,中國(guó)地圖和世界地圖豁遭,這兩個(gè)地圖顯示在不同的 <div id= 中,利用一個(gè) Switch 按鈕切換

會(huì)出現(xiàn)的問(wèn)題是贺拣,首次進(jìn)入頁(yè)面(不妨設(shè)進(jìn)入中國(guó)地圖)一切正常蓖谢,點(diǎn)擊 Switch 切換到世界地圖,正常譬涡,再切換回中國(guó)地圖闪幽,卡死

類似的卡死問(wèn)題還有,進(jìn)入 map 頁(yè)面后點(diǎn)擊菜單切換到別的頁(yè)面涡匀,然后切換回來(lái)盯腌,卡死

使用 antv-l7 提供的 scene.destroy 并不能解決問(wèn)題

后來(lái)利用了 keep-alive 解決,即 <Nuxt keep-alive />陨瘩,將地圖的代碼封裝成一個(gè) Component腕够,然后把這個(gè)組件保留起來(lái),避免重復(fù)加載

<Nuxt keep-alive />

圖層的位置在拖動(dòng)時(shí)會(huì)變

地圖圖層和標(biāo)注點(diǎn)的圖層拖動(dòng)時(shí)不一致舌劳,導(dǎo)致拖動(dòng)后點(diǎn)的位置錯(cuò)位

position: relative

這個(gè)其實(shí)在官方文檔寫(xiě)了帚湘,這個(gè)屬性很重要,否則地圖會(huì)鋪滿上層 div甚淡,并且縮放時(shí)點(diǎn)的位置會(huì)偏移

可以根據(jù)自己的情況考慮使用 absolute

MapBox 地圖不會(huì)自動(dòng)鋪滿大诸,而 GaodeMap 會(huì)鋪滿

大坑

如果設(shè)置了類似于父組件的寬度根據(jù)瀏覽器的寬度變化這樣的功能,期望地圖的大小始終跟著瀏覽器寬度變化的話,GaodeMao 沒(méi)有任何問(wèn)題底挫,會(huì)自動(dòng)鋪滿整個(gè)屏幕恒傻,但 MapBox 地圖在初次顯示時(shí),仍然會(huì)莫名其妙變成 400 * 300 大小建邓,只有在重新改變?yōu)g覽器寬度時(shí)才會(huì)正確鋪滿

這個(gè)問(wèn)題在 Github 上有人提出(https://github.com/mapbox/mapbox-gl-js/issues/3265)盈厘,是由于 MapBox 初次加載時(shí)長(zhǎng)寬一定為 300 * 400,必須經(jīng)過(guò)一次 map.resize() 才能正確獲得目標(biāo) div 的大小

由于 AntV-l7 做了一層封裝官边,所以我們不太好直接去調(diào)用 map.resize()沸手,但是我們可以簡(jiǎn)單地直接觸發(fā) window 的 resize 事件

scene.on('loaded', () => {
    window.dispatchEvent(new Event('resize'))
})

這樣,窗口大小不變注簿,但是 window.resize 被觸發(fā)了契吉,MapBox 的 resize 也被觸發(fā)了,MapBox 的大小也就正常了

地圖的 scene 的 on load 中讀取 vuex 中的值無(wú)效

不知道原因诡渴,在組件 mounted 的時(shí)候去讀 vuex 中的屏幕寬度捐晶,期望能夠設(shè)置到 div 的樣式,但發(fā)現(xiàn)這個(gè)值能夠被正確輸出妄辩,地圖大小卻不對(duì)

懷疑是 antv-l7 繪制是在 mounted 拿到數(shù)據(jù)之前惑灵,但我沒(méi)仔細(xì)去研究 antv-l7 地圖繪制是在什么階段完成的,所以不知道是不是用 async 這樣的方法就可以確保 mounted 拿到數(shù)據(jù)后才繪制地圖眼耀,也可能根本就不是這個(gè)原因英支,總之,我不知道有沒(méi)有更好的解決方案

我通過(guò)強(qiáng)制讓數(shù)據(jù)發(fā)生變化哮伟,觸發(fā) vue 對(duì)所有組件的重新繪制

that.screenWidth = that.$store.getters['size/getWidth']
that.screenWidth -= 1
that.screenWidth += 1 // nextTick
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末干花,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子楞黄,更是在濱河造成了極大的恐慌池凄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谅辣,死亡現(xiàn)場(chǎng)離奇詭異修赞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)桑阶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)柏副,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚣录,你說(shuō)我怎么就攤上這事割择。” “怎么了萎河?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵荔泳,是天一觀的道長(zhǎng)蕉饼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)玛歌,這世上最難降的妖魔是什么昧港? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮支子,結(jié)果婚禮上创肥,老公的妹妹穿的比我還像新娘。我一直安慰自己值朋,他們只是感情好叹侄,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著昨登,像睡著了一般趾代。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丰辣,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天撒强,我揣著相機(jī)與錄音,去河邊找鬼糯俗。 笑死尿褪,一個(gè)胖子當(dāng)著我的面吹牛睦擂,可吹牛的內(nèi)容都是我干的得湘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼顿仇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼淘正!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起臼闻,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤鸿吆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后述呐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惩淳,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年乓搬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了思犁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡进肯,死狀恐怖激蹲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情江掩,我是刑警寧澤学辱,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布乘瓤,位于F島的核電站,受9級(jí)特大地震影響策泣,放射性物質(zhì)發(fā)生泄漏衙傀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一萨咕、第九天 我趴在偏房一處隱蔽的房頂上張望差油。 院中可真熱鬧,春花似錦任洞、人聲如沸蓄喇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)妆偏。三九已至,卻和暖如春盅弛,著一層夾襖步出監(jiān)牢的瞬間钱骂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工挪鹏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留见秽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓讨盒,卻偏偏與公主長(zhǎng)得像解取,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子返顺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容