element-ui中select下拉框加載大數(shù)據(jù)渲染優(yōu)化方式
現(xiàn)在的前端項(xiàng)目中對(duì)于element-ui的使用幾乎已經(jīng)是一個(gè)常規(guī)動(dòng)作了,但是組件庫(kù)中的ui組件不一定都能滿足實(shí)際場(chǎng)景的需求,比如今天要講的select下拉框選擇組件。
我們公司是做證券行業(yè)基礎(chǔ)設(shè)施的,股票和證券的數(shù)量動(dòng)不動(dòng)就是上千,當(dāng)使用select渲染的時(shí)候就會(huì)很有壓力,我司大致3000條數(shù)據(jù),全部渲染出來(lái)大致需要4s左右,并且多選模式時(shí),選中和反選時(shí)會(huì)明顯感覺(jué)卡頓,這在體驗(yàn)上是覺(jué)得不能接受的,所以就開始了優(yōu)化歷程。
方案一
把下拉多選功能做成彈框表格多選
可行性:表格設(shè)置selection屬性,翻頁(yè)功能可以解決大數(shù)據(jù)問(wèn)題
實(shí)際情況:需要展示的字段只要2個(gè)即可,對(duì)于表格來(lái)說(shuō)太少,顯得太空;產(chǎn)品也不同意
棄之~~
方案二
利用select的遠(yuǎn)程搜索功能,初始化只加載指定數(shù)量數(shù)據(jù),其它數(shù)據(jù)通過(guò)搜索功能查詢
可行性:能滿足大數(shù)據(jù)需求,只是體驗(yàn)上打了點(diǎn)折扣,后臺(tái)也能支持
實(shí)際情況:產(chǎn)品能接受
暫時(shí)只想到了這兩種方案,和后臺(tái)商量了一下,具有可實(shí)施性,于是采用該方案。
方案分析
1.問(wèn)題的根源是一次性渲染太多數(shù)據(jù)導(dǎo)致卡頓,那么第一次加載的數(shù)據(jù)就需要找到一個(gè)既能最大限度滿足業(yè)務(wù)需求,又能無(wú)感加載的臨界值,最終我選了300條
2.輸入中文搜索時(shí)傳遞queryName作為模糊查詢條件
3.如果通過(guò)搜索條件勾選了300條以后的數(shù)據(jù),失去焦點(diǎn),重新獲取焦點(diǎn)時(shí),需要將已勾選的數(shù)據(jù)放到300條數(shù)據(jù)的最前面,方便用戶查看和反選,此時(shí)需要用已選擇數(shù)據(jù)的id結(jié)合作為查詢條件queryIds
4.編輯時(shí)后臺(tái)只會(huì)返回新增時(shí)添加項(xiàng)對(duì)應(yīng)的id集合,要正確顯示對(duì)應(yīng)的name值,需將id集合作為參數(shù)請(qǐng)求列表數(shù)據(jù),如果不加參數(shù)默認(rèn)返回前300條數(shù)據(jù),如果id里有300之后的數(shù)據(jù),則不會(huì)正確展示。第一次新增時(shí)無(wú)需傳參。
基于以上分析,開始寫代碼
<!-- -->
<template>
<div class="container">
<el-select
v-model="selectVal"
filterable
multiple
clearable
collapse-tags
remote
reserve-keyword
:remote-method='remoteMethod'
@focus="focus"
>
<el-option v-for="(item, index) in options" :key="index"
:label='item.label'
:value='item.id'
>
</el-option>
</el-select>
</div>
</template>
<script>
export default {
data () {
return {
selectVal: [],
options: [
// {
// id: 1,
// label: 'one'
// },
// {
// id: 1,
// label: 'one'
// }
]
};
},
mounted() {
this.getData()
},
methods: {
getData(queryName, queryIds) {
this.$api('api/get', {
queryName: queryName || '',
queryIds: queryIds || '',
}).then(res => {
this.options = res.data
}).catch(err => {
// dosomething
})
},
remoteMethod(query) {
// 輸入文字模糊搜索,覆蓋舊數(shù)據(jù)
this.getData(query)
},
focus(event) {
if(!event.sourceCapabilities) return // 如果是勾選或反選下拉選項(xiàng)
if(!event.target.value) { // 輸入框沒(méi)有搜索條件時(shí)觸發(fā)
this.getData(undefined, this.selectVal)
}
}
}
}
</script>
<style lang='scss' scoped>
</style>focus函數(shù)是用來(lái)解決問(wèn)題3或者編輯時(shí)獲取焦點(diǎn)的,但是element-ui的select中點(diǎn)擊選項(xiàng)時(shí)會(huì)觸發(fā)focus方法,對(duì)比了正真的focus和點(diǎn)擊,發(fā)現(xiàn)只有event.sourceCapabilities值可以區(qū)分,便用于區(qū)分這兩個(gè)事件;
如果有搜索條件時(shí)也不觸發(fā)id搜索,只觸發(fā)默認(rèn)的remoteMethod即可
新增數(shù)據(jù)的時(shí)候已經(jīng)可以用了,編輯的時(shí)候就會(huì)遇到問(wèn)題4,此時(shí)需要用返回的id集合作為參數(shù)請(qǐng)求下拉數(shù)據(jù),以正確展示已選數(shù)據(jù)
data () {
return {
selectVal: [],
options: [
// {
// id: 1,
// label: 'one'
// },
// {
// id: 1,
// label: 'one'
// }
],
type: 'edit'
};
},
mounted() {
this.initDialog()
},
methods: {
initDialog() {
this.getEditInfo(this.type).then(ids => {
this.selectVal = ids
this.getData(undefined, ids)
})
},
getEditInfo(type) {
return new Promise((resolve, reject) => {
if(type === 'edit') { // 編輯
this.$api('api/getInfo', {}).then(res => {
let ids = res.data
resolve(ids)
}).catch(err => {
// dosomething
})
}else {
resolve()
}
})
},
getData(queryName, queryIds) {
this.$api('api/getOptions', {
queryName: queryName || '',
queryIds: queryIds || '',
}).then(res => {
this.options = res.data
}).catch(err => {
// dosomething
})
},
remoteMethod(query) {
// 輸入文字模糊搜索,覆蓋舊數(shù)據(jù)
this.getData(query)
},
focus(event) {
if(!event.sourceCapabilities) return // 如果是勾選或反選下拉選項(xiàng)
if(!event.target.value) { // 輸入框沒(méi)有搜索條件時(shí)觸發(fā)
this.getData(undefined, this.selectVal)
}
}
}這樣就可以滿足大數(shù)據(jù)加載的需求了
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 如何解決element-ui中select下拉框popper超出彈框問(wèn)題
- 去除element-ui下拉框的下拉箭頭的實(shí)現(xiàn)
- 基于element-ui中el-select下拉框選項(xiàng)過(guò)多的優(yōu)化方案
- 關(guān)于element-ui?select?下拉框位置錯(cuò)亂問(wèn)題解決
- element-ui+vue-treeselect下拉框的校驗(yàn)過(guò)程
- 解決element-ui的下拉框有值卻無(wú)法選中的情況
- Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解
- 在element-ui的select下拉框加上滾動(dòng)加載
- 使用Vant完成DatetimePicker 日期的選擇器操作
- 如何修改element-ui日期下拉框datetimePicker的背景色樣式
相關(guān)文章
vuex項(xiàng)目中登錄狀態(tài)管理的實(shí)踐過(guò)程
由于狀態(tài)零散地分布在許多組件和組件之間的交互中,大型應(yīng)用復(fù)雜度也經(jīng)常逐漸增長(zhǎng),為了解決這個(gè)問(wèn)題,Vue 提供 vuex,這篇文章主要給大家介紹了關(guān)于vuex項(xiàng)目中登錄狀態(tài)管理的相關(guān)資料,需要的朋友可以參考下2021-09-09
如何優(yōu)雅的在一臺(tái)vps(云主機(jī))上面部署vue+mongodb+express項(xiàng)目
這篇文章主要介紹了如何優(yōu)雅的在一臺(tái)vps(云主機(jī))上面部署vue+mongodb+express項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
vue computed的set方法無(wú)效問(wèn)題及解決
這篇文章主要介紹了vue computed的set方法無(wú)效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
vue.js vue-router如何實(shí)現(xiàn)無(wú)效路由(404)的友好提示
眾所周知vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用于構(gòu)建單頁(yè)面應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于vue.js中vue-router如何實(shí)現(xiàn)無(wú)效路由(404)的友好提示的相關(guān)資料,需要的朋友可以參考下。2017-12-12
Element-UI日期選擇器(選擇日期范圍)禁用未來(lái)日期實(shí)現(xiàn)代碼
我們?cè)诰W(wǎng)頁(yè)開發(fā)時(shí)通常需要用到一些日期組件來(lái)方便用戶選擇時(shí)間,其中element日期組件是一個(gè)非常好用的工具,這篇文章主要給大家介紹了關(guān)于Element-UI日期選擇器(選擇日期范圍)禁用未來(lái)日期的相關(guān)資料,需要的朋友可以參考下2024-02-02

