element-ui中select下拉框加載大數(shù)據(jù)渲染優(yōu)化方式
現(xiàn)在的前端項目中對于element-ui的使用幾乎已經(jīng)是一個常規(guī)動作了,但是組件庫中的ui組件不一定都能滿足實際場景的需求,比如今天要講的select下拉框選擇組件。
我們公司是做證券行業(yè)基礎(chǔ)設(shè)施的,股票和證券的數(shù)量動不動就是上千,當(dāng)使用select渲染的時候就會很有壓力,我司大致3000條數(shù)據(jù),全部渲染出來大致需要4s左右,并且多選模式時,選中和反選時會明顯感覺卡頓,這在體驗上是覺得不能接受的,所以就開始了優(yōu)化歷程。
方案一
把下拉多選功能做成彈框表格多選
可行性:表格設(shè)置selection屬性,翻頁功能可以解決大數(shù)據(jù)問題
實際情況:需要展示的字段只要2個即可,對于表格來說太少,顯得太空;產(chǎn)品也不同意
棄之~~
方案二
利用select的遠(yuǎn)程搜索功能,初始化只加載指定數(shù)量數(shù)據(jù),其它數(shù)據(jù)通過搜索功能查詢
可行性:能滿足大數(shù)據(jù)需求,只是體驗上打了點折扣,后臺也能支持
實際情況:產(chǎn)品能接受
暫時只想到了這兩種方案,和后臺商量了一下,具有可實施性,于是采用該方案。
方案分析
1.問題的根源是一次性渲染太多數(shù)據(jù)導(dǎo)致卡頓,那么第一次加載的數(shù)據(jù)就需要找到一個既能最大限度滿足業(yè)務(wù)需求,又能無感加載的臨界值,最終我選了300條
2.輸入中文搜索時傳遞queryName作為模糊查詢條件
3.如果通過搜索條件勾選了300條以后的數(shù)據(jù),失去焦點,重新獲取焦點時,需要將已勾選的數(shù)據(jù)放到300條數(shù)據(jù)的最前面,方便用戶查看和反選,此時需要用已選擇數(shù)據(jù)的id結(jié)合作為查詢條件queryIds
4.編輯時后臺只會返回新增時添加項對應(yīng)的id集合,要正確顯示對應(yīng)的name值,需將id集合作為參數(shù)請求列表數(shù)據(jù),如果不加參數(shù)默認(rèn)返回前300條數(shù)據(jù),如果id里有300之后的數(shù)據(jù),則不會正確展示。第一次新增時無需傳參。
基于以上分析,開始寫代碼
<!-- --> <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 // 如果是勾選或反選下拉選項 if(!event.target.value) { // 輸入框沒有搜索條件時觸發(fā) this.getData(undefined, this.selectVal) } } } } </script> <style lang='scss' scoped> </style>
focus函數(shù)是用來解決問題3或者編輯時獲取焦點的,但是element-ui的select中點擊選項時會觸發(fā)focus方法,對比了正真的focus和點擊,發(fā)現(xiàn)只有event.sourceCapabilities值可以區(qū)分,便用于區(qū)分這兩個事件;
如果有搜索條件時也不觸發(fā)id搜索,只觸發(fā)默認(rèn)的remoteMethod即可
新增數(shù)據(jù)的時候已經(jīng)可以用了,編輯的時候就會遇到問題4,此時需要用返回的id集合作為參數(shù)請求下拉數(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 // 如果是勾選或反選下拉選項 if(!event.target.value) { // 輸入框沒有搜索條件時觸發(fā) this.getData(undefined, this.selectVal) } } }
這樣就可以滿足大數(shù)據(jù)加載的需求了
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- 如何解決element-ui中select下拉框popper超出彈框問題
- 去除element-ui下拉框的下拉箭頭的實現(xiàn)
- 基于element-ui中el-select下拉框選項過多的優(yōu)化方案
- 關(guān)于element-ui?select?下拉框位置錯亂問題解決
- element-ui+vue-treeselect下拉框的校驗過程
- 解決element-ui的下拉框有值卻無法選中的情況
- Vue + Element-ui的下拉框el-select獲取額外參數(shù)詳解
- 在element-ui的select下拉框加上滾動加載
- 使用Vant完成DatetimePicker 日期的選擇器操作
- 如何修改element-ui日期下拉框datetimePicker的背景色樣式
相關(guān)文章
如何優(yōu)雅的在一臺vps(云主機(jī))上面部署vue+mongodb+express項目
這篇文章主要介紹了如何優(yōu)雅的在一臺vps(云主機(jī))上面部署vue+mongodb+express項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01vue.js vue-router如何實現(xiàn)無效路由(404)的友好提示
眾所周知vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用于構(gòu)建單頁面應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于vue.js中vue-router如何實現(xiàn)無效路由(404)的友好提示的相關(guān)資料,需要的朋友可以參考下。2017-12-12Element-UI日期選擇器(選擇日期范圍)禁用未來日期實現(xiàn)代碼
我們在網(wǎng)頁開發(fā)時通常需要用到一些日期組件來方便用戶選擇時間,其中element日期組件是一個非常好用的工具,這篇文章主要給大家介紹了關(guān)于Element-UI日期選擇器(選擇日期范圍)禁用未來日期的相關(guān)資料,需要的朋友可以參考下2024-02-02