elementPlus中的Autocomplete彈出層錯(cuò)位問題解決分析
問題描述
- 在餓了么UI中有一個(gè)Autocomplete搜索建議輸入框組件,一般這個(gè)組件是用于做遠(yuǎn)程關(guān)聯(lián)搜索的(類似百度一下咱們輸入一個(gè)字,會(huì)提示出相關(guān)的選擇建議)
- 可是在某些情況下,這個(gè)Autocomplete組件的彈出層部分會(huì)出現(xiàn)錯(cuò)位的情況(Autocomplete組件 = 輸入框部分 + 彈出層部分)
- 就像下面的這個(gè)效果圖
對(duì)于這樣的錯(cuò)位問題,筆者提供一個(gè)偏向于源頭
的寫法,能夠快速解決問題
思路分析
- 我們知道,就前端而言,彈出層是一個(gè)非?;A(chǔ)的效果功能
- 目前市面上我們所使用的開源組件庫(kù)的,但凡涉及到彈出層功能的,比如
dropdown
、Tooltip
、Select
的彈出層,基本上都是在Popper.js
的基礎(chǔ)之上封裝的 - vue2版本中vue團(tuán)隊(duì)基于
Popper.js
封裝了一個(gè)vue-popper
組件 - 而餓了么團(tuán)隊(duì)又基于
vue-popper
組件去封裝成各個(gè)帶有彈出層的組件功能 - PS:前端組件就是不停的封裝(套殼子)...
- 筆者也曾經(jīng)基于
vue-popper
組件封裝了一個(gè)屬于自己的tooltip
,大家有空了也可以點(diǎn)擊鏈接去瞅瞅
文章地址:http://www.dbjr.com.cn/javascript/29319297k.htm
- 既然Autocomplete組件的彈出層出現(xiàn)了錯(cuò)位的問題,那么本質(zhì)上來說,還是源頭上
Popper.js
的問題 - 因?yàn)閺棾鰧拥奈恢?,是Popper.js計(jì)算出來的
- 所以,當(dāng)彈出層位置錯(cuò)位的時(shí)候,我們只需要讓Popper.js重新計(jì)算一下位置就能恢復(fù)正常了
Popper.js
的源代碼中有監(jiān)聽resize事件,從而計(jì)算出對(duì)應(yīng)的彈出層位置
popper.js的源代碼
筆者去github上扒了一下popper.js的源代碼,簡(jiǎn)單截圖如下:
所以解決方案就有啦...
解決方案
- 當(dāng)我們的彈出層位置不對(duì)的時(shí)候
- 我們只需要再次派發(fā)一個(gè)resize事件即可
- 因?yàn)镻opper.js監(jiān)聽了resize事件,會(huì)自動(dòng)計(jì)算的,相當(dāng)于鉤子函數(shù)
- 需要讓Popper.js重新計(jì)算一下就能“羅漢歸位”
- 如何去派發(fā)一個(gè)resize事件呢?很簡(jiǎn)單:
window.dispatchEvent(new Event('resize'))
window.dispatchEvent(new Event('resize'))
window.dispatchEvent(new Event('resize'))
比如以下代碼demo:
const querySearchAsync = (queryString, cb) => { setTimeout(() => { let apiData = [ { value: '孫悟空', id: '111' }, { value: '豬八戒', id: '222' }, { value: '沙和尚', id: '333' }, ] cb(apiData) // 解決el-autocomplete彈出建議層錯(cuò)位問題(poper.js就是監(jiān)聽resize事件重新計(jì)算dom位置的) window.dispatchEvent(new Event('resize')) }, 340); }
注意,要在合適的時(shí)機(jī)去派發(fā)resize事件哦
以上就是elementPlus中的Autocomplete彈出層錯(cuò)位問題解決分析的詳細(xì)內(nèi)容,更多關(guān)于elementPlus Autocomplete彈出層錯(cuò)位的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue鼠標(biāo)移入添加class樣式,鼠標(biāo)移出去除樣式(active)實(shí)現(xiàn)方法
今天小編就為大家分享一篇vue鼠標(biāo)移入添加class樣式,鼠標(biāo)移出去除樣式(active)實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08vue移動(dòng)端實(shí)現(xiàn)手機(jī)左右滑動(dòng)入場(chǎng)動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了vue移動(dòng)端實(shí)現(xiàn)手機(jī)左右滑動(dòng)入場(chǎng)動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08element-ui圖像組件、上傳組件以及分頁(yè)組件實(shí)現(xiàn)代碼
工作中碰到需要多圖上傳,在使用element-ui解決過程中碰到一些問題,在這里分享給大家,這篇文章主要給大家介紹了關(guān)于element-ui圖像組件、上傳組件以及分頁(yè)組件實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2024-02-02Vue 實(shí)現(xiàn)一個(gè)命令式彈窗組件功能
這篇文章主要介紹了vue實(shí)現(xiàn)命令式彈窗組件功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09五分鐘搞懂Vuex實(shí)用知識(shí)(小結(jié))
本篇文章主要介紹了五分鐘搞懂Vuex實(shí)用知識(shí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08深入理解Vue.js3中Reactive的實(shí)現(xiàn)
reactive是Vue 3的Composition API中的一個(gè)函數(shù),它允許你創(chuàng)建一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象,本文主要介紹了深入理解Vue.js3中Reactive的實(shí)現(xiàn),感興趣的可以了解一下2024-01-01