Element中select多數(shù)據(jù)加載優(yōu)化的實(shí)現(xiàn)
場(chǎng)景
近期著手開(kāi)發(fā)基于ElementUI的后臺(tái)管理系統(tǒng),偶然間發(fā)現(xiàn)「el-select」下拉選擇時(shí)候遇到一個(gè)問(wèn)題,當(dāng)渲染下拉選項(xiàng)的「options」的數(shù)據(jù)量過(guò)多時(shí)「本項(xiàng)目中的數(shù)據(jù)條目已過(guò)萬(wàn)」,就會(huì)出現(xiàn)下拉選擇器卡頓的情況,尤其是在模糊匹配過(guò)濾的情況下,顯得十分的卡頓。初始化選擇器的時(shí)候,也會(huì)點(diǎn)擊無(wú)反應(yīng),有時(shí)候需要點(diǎn)擊多次才可出現(xiàn)「dialog」彈窗(本次下拉篩選在彈窗中實(shí)現(xiàn))。 翻閱多篇博客筆記之后,最終找到一個(gè)可以解決問(wèn)題的方案,現(xiàn)將此次優(yōu)化方案記錄成為筆記,以便于日后遇到類似問(wèn)題的時(shí)候便于查閱。

注:基于select的下拉篩選,通過(guò)自定義事件來(lái)實(shí)現(xiàn)模糊搜索匹配。
一共兩種方案:
- 一是獲取所有數(shù)據(jù),通過(guò)輸入的關(guān)鍵字自己對(duì)獲取的數(shù)據(jù)進(jìn)行過(guò)濾處理;
- 二是通過(guò)輸入的關(guān)鍵字來(lái)動(dòng)態(tài)請(qǐng)求后臺(tái)接口,通過(guò)接口返回的數(shù)據(jù)來(lái)動(dòng)態(tài)渲染下拉選項(xiàng);
代碼實(shí)現(xiàn)
Vue組件實(shí)例
<template>
<div class="app">
<el-dialog title="標(biāo)題" :visible.sync="relatedOpen" :append-to-body="true" width="500px">
<el-row :gutter="16">
<el-col :span="20">
<el-select
v-model="value"
filterable
clearable
style="width:100%"
placeholder="請(qǐng)選擇"
:loading="searchLoad"
:filter-method="filterMethod"
v-el-select-loadmore="loadMore(rangeNumber)"
@visible-change="visibleChange"
>
<el-option v-for="item in options.slice(0, rangeNumber)" :key="item.key" :label="item.value" :value="item.key"></el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="submit">確定</el-button>
</el-col>
</el-row>
</el-dialog>
</div>
</template>
- 「v-el-select-loadmore」為自定義指令封裝的數(shù)據(jù)加載指令,是為了解決和優(yōu)化elementUI下拉選擇器加載數(shù)據(jù)過(guò)多出現(xiàn)卡頓問(wèn)題的。
- 「filter-method」是下拉選擇器的一個(gè)自定義屬性,可以監(jiān)聽(tīng)輸入的變量,從而依據(jù)變量來(lái)實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)獲取;
// 自定義指令
directives: {
"el-select-loadmore": (el, binding) => {
// 獲取element UI定義好的scroll元素
const SELECTWRAP_ROM = el.querySelector(".el-select-dropdown .el-select-dropdown__wrap");
if (SELECTWRAP_ROM) {
// 添加scroll事件
SELECTWRAP_ROM.addEventListener("scroll", function() {
// 判斷滾動(dòng)
const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;
condition && binding.value();
});
}
}
}
相應(yīng)的數(shù)據(jù)函數(shù)
export default {
data() {
return {
relatedOpen: false,
options: [] /* 選擇下拉框的值 */,
courseList: [],
rangeNumber: 10,
searchLoad: false /* 下拉框的loading狀態(tài) */,
value: "",
timer: null
};
},
created() {
this.getOptions();
},
methods: {
// 按需加載
loadMore(n) {
return () => (this.rangeNumber += 5);
},
// 過(guò)濾課件
filterMethod(query) {
if (this.timer != null) clearTimeout(this.timer);
!this.searchLoad && (this.searchLoad = true);
this.timer = setTimeout(() => {
this.options = !!query ? this.courseList.filter(el => el.value.toLowerCase().includes(query.toLowerCase())) : this.courseList;
clearTimeout(this.timer);
this.searchLoad = false;
this.rangeNumber = 10;
this.timer = null;
}, 500);
},
// 監(jiān)聽(tīng)select下拉框的顯示和隱藏
visibleChange(flag) {
// 顯示時(shí)初始化列表
flag && this.filterMethod("");
// 初始化默認(rèn)值
this.rangeNumber = 10;
},
// 獲取選項(xiàng)
async getOptions() {
await searchCourseware().then(res => {
let list = res.data || [];
// 默認(rèn)展示的數(shù)據(jù)
this.options = list;
// 原始數(shù)據(jù)
this.courseList = list;
});
}
}
}
注:
- 定時(shí)器作用是防止輸入篩選的關(guān)鍵字太過(guò)頻繁,從而造成數(shù)據(jù)響應(yīng)不及時(shí);因?yàn)楸敬问且淮涡垣@取了全部的數(shù)據(jù),所以這里只是用做渲染加載數(shù)據(jù);
- 選擇器的事件函數(shù)主要是用來(lái)初始化“獲取焦點(diǎn)”和“失去焦點(diǎn)”時(shí)處理默認(rèn)展示數(shù)據(jù)用的,若是獲取的網(wǎng)絡(luò)請(qǐng)求,此處需要做“函數(shù)截流”處理;目的是減少接口請(qǐng)求次數(shù)。
總結(jié):
換了新的工作環(huán)境,現(xiàn)開(kāi)始著手做后臺(tái)管理系統(tǒng),或多或少會(huì)遇到各種各樣的問(wèn)題。一如即往,會(huì)在筆記中記錄開(kāi)發(fā)中遇到的問(wèn)題。好記性不如爛筆頭,希望現(xiàn)在埋下種子,等到來(lái)年秋天的時(shí)候會(huì)收獲🍒果實(shí)。JY
到此這篇關(guān)于Element中select多數(shù)據(jù)加載優(yōu)化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Element select多數(shù)據(jù)加載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue源碼學(xué)習(xí)之?dāng)?shù)據(jù)初始化
這篇文章主要為大家介紹了Vue源碼學(xué)習(xí)之?dāng)?shù)據(jù)初始化實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
vuex頁(yè)面刷新數(shù)據(jù)丟失問(wèn)題的四種解決方式
vuex是大家使用vue時(shí)大多數(shù)都會(huì)選擇的,但是當(dāng)頁(yè)面刷新之后vuex數(shù)據(jù)會(huì)丟失,下面這篇文章主要給大家介紹了關(guān)于vuex頁(yè)面刷新數(shù)據(jù)丟失問(wèn)題的四種解決方式,需要的朋友可以參考下2022-02-02
Element Table 自適應(yīng)高度的實(shí)現(xiàn)示例
el-table的高度不能適應(yīng)不同電腦的分辨率,也不能跟隨瀏覽器的高度變化而變化的問(wèn)題,本文就來(lái)解決一下Element Table 自適應(yīng)高度,感興趣的可以了解一下2024-07-07
Vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證功能
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)滑動(dòng)驗(yàn)證功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
詳解vue+vuex+koa2開(kāi)發(fā)環(huán)境搭建及示例開(kāi)發(fā)
本篇文章主要介紹了詳解vue + vuex + koa2開(kāi)發(fā)環(huán)境搭建及示例開(kāi)發(fā),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01

