vue2中的el-select組件數(shù)據(jù)太多,如何實(shí)現(xiàn)滾動(dòng)加載數(shù)據(jù)效果
項(xiàng)目場(chǎng)景
在我們平常開(kāi)發(fā)中,我們的下拉框數(shù)據(jù)大部分都是后端一次性返回,然后前端直接塞到頁(yè)面渲染
我之前也是這么做的,但今天發(fā)現(xiàn)數(shù)據(jù)變得越來(lái)越多,已經(jīng)有五百多條了
所以我就決定著手優(yōu)化一下,怎么優(yōu)化呢
比如 分頁(yè)加載?虛擬列表?
問(wèn)題描述
當(dāng)我們使用el-select下拉框選擇數(shù)據(jù)的時(shí)候,避免不了數(shù)據(jù)過(guò)多,導(dǎo)致一上來(lái)渲染到頁(yè)面會(huì)出現(xiàn)卡頓現(xiàn)象
比如說(shuō)四五百條數(shù)據(jù),一下子塞到下拉框中,頁(yè)面剛開(kāi)始渲染的時(shí)候
頁(yè)面許多地方都在渲染數(shù)據(jù)、重排、重繪,數(shù)據(jù)少還可以,數(shù)據(jù)太多會(huì)影響性能。
解決方案
el-select給我們提供了 支持遠(yuǎn)程搜索的功能,這樣我們可以一次渲染少許數(shù)據(jù),剩下數(shù)據(jù)可以通過(guò)搜索獲取。
但有時(shí)候 我不知道要搜索的數(shù)據(jù)名字叫什么,從而導(dǎo)致無(wú)法有效搜索,還有就是每次搜索都要請(qǐng)求一次數(shù)據(jù),其實(shí)官方這個(gè)優(yōu)化已經(jīng)解決大部分場(chǎng)景問(wèn)題了。
對(duì)于el-select的場(chǎng)景,顯然 虛擬列表 不是最優(yōu)的,因?yàn)樘摂M列表會(huì)把視口外的元素從dom樹(shù)里移出去,導(dǎo)致我們選擇的數(shù)據(jù)狀態(tài)無(wú)法保存,所以我決定使用分頁(yè)加載 。
后端剛開(kāi)始一次性把所有數(shù)據(jù)返回給我,然后前端分批進(jìn)行渲染,如果后端一次性請(qǐng)求所有數(shù)據(jù)太慢,也可以分批加載,具體可以與后端溝通。
代碼如下
一開(kāi)始先拿20條數(shù)據(jù),渲染頁(yè)面,聲明一個(gè)變量保存所有數(shù)據(jù)

//html結(jié)構(gòu)
<el-select v-model="hospital" @visible-change="visible" placeholder="請(qǐng)選擇醫(yī)院" filterable collapse-tags multiple @change='changeHospital'>
<el-option :disabled="loading" :label="item.hospital_name" :value="item.hospital_id" v-for="(item,index) in hospitalList" :key="item.hospital_id"></el-option>
</el-select>
//js代碼
// 下拉框出現(xiàn)的時(shí)候事件
visible(val){
//如果多個(gè)下拉框,需要具體給某個(gè)標(biāo)簽綁定
let scroll = document.querySelectorAll('.el-scrollbar__wrap')
//顯示的時(shí)候綁定,隱藏的時(shí)候移出綁定事件
if(val){
scroll[1].addEventListener('scroll',this.scrollLoad)
}else{
scroll[1].removeEventListener('scroll',this.scrollLoad)
}
},
// 下拉框滾動(dòng)分頁(yè)加載數(shù)據(jù)
scrollLoad(e){
const { target: { clientHeight,scrollHeight,scrollTop } } = e
const step = 100 //間隔,距離底部100的時(shí)候加載數(shù)據(jù)
const len = this.hospitalList.length //獲取當(dāng)前展示的醫(yī)院列表長(zhǎng)度
if(len >= this.hospital_list.length)return //數(shù)據(jù)加載完畢
//從總列表里每次 截取一段數(shù)據(jù),以便后期追加到頁(yè)面
// 每次追加20條
const data = this.hospital_list.slice(len,len + 20)
//判斷觸底加載數(shù)據(jù)
if(clientHeight + scrollTop >= scrollHeight - step){
this.hospitalList.push(...data)
console.log('觸底加載數(shù)據(jù)');
}
}
如果感覺(jué)滾動(dòng)監(jiān)聽(tīng)太頻繁,可以加個(gè)節(jié)流處理,我這里沒(méi)有加
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue+WebSocket頁(yè)面實(shí)時(shí)刷新長(zhǎng)連接的實(shí)現(xiàn)
最近vue項(xiàng)目要做數(shù)據(jù)實(shí)時(shí)刷新,數(shù)據(jù)較大,會(huì)出現(xiàn)卡死情況,所以本文主要介紹了頁(yè)面實(shí)時(shí)刷新長(zhǎng)連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
vue.js 輸入框輸入值自動(dòng)過(guò)濾特殊字符替換中問(wèn)標(biāo)點(diǎn)操作
這篇文章主要介紹了vue.js 輸入框輸入值自動(dòng)過(guò)濾特殊字符替換中問(wèn)標(biāo)點(diǎn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08
Vue?圖片監(jiān)聽(tīng)鼠標(biāo)滑輪滾動(dòng)實(shí)現(xiàn)圖片縮小放大功能(實(shí)現(xiàn)思路)
其實(shí)想要實(shí)現(xiàn)功能很簡(jiǎn)單,就是在一張圖片上監(jiān)聽(tīng)鼠標(biāo)滑輪滾動(dòng)的事件,然后根據(jù)上滾還是下滾實(shí)現(xiàn)圖片的縮放,這篇文章主要介紹了Vue?實(shí)現(xiàn)圖片監(jiān)聽(tīng)鼠標(biāo)滑輪滾動(dòng)實(shí)現(xiàn)圖片縮小放大功能,需要的朋友可以參考下2023-03-03
element table跨分頁(yè)多選及回顯的實(shí)現(xiàn)示例
本文主要介紹了element table跨分頁(yè)多選及回顯的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
關(guān)于element-ui中@selection-change執(zhí)行兩次的問(wèn)題
這篇文章主要介紹了關(guān)于element-ui中@selection-change執(zhí)行兩次的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08

