el-select資料過多處理方式
在日常專案中el-select
元件的使用頻率是非常之高的. 當資料過多時渲染時間非常長, 這裡提供幾個處理方式.
遠端搜尋
元件提供了遠端搜尋方式, 也就是按照你輸入的結果匹配選項.
官網提供了參考示例; 這裡不加贅述.
下拉懶載入loadMore
下拉懶載入, 當select滾動到底部時, 你再去請求一部分資料, 加入到當前資料中.
某元件中:
<template>
<el-select
v-model="value"
placeholder="請選擇"
filterable
multiple
v-el-select-loadmore="loadmore"
>
<el-option
v-for="item in options"
:key="item.id"
:label="item.label"
:value="item.id">
</el-option>
</el-select>
</template>
export default {
directives: {
`el-select-loadmore`: {
bind(el, binding) {
// 獲取element-ui定義好的scroll盒子
const SELECTWRAP_DOM = el.querySelector(`.el-select-dropdown .el-select-dropdown__wrap`);
SELECTWRAP_DOM.addEventListener(`scroll`, function () {
/**
* scrollHeight 獲取元素內容高度(只讀)
* scrollTop 獲取或者設定元素的偏移值,常用於, 計算滾動條的位置, 當一個元素的容器沒有產生垂直方向的滾動條, 那它的scrollTop的值預設為0.
* clientHeight 讀取元素的可見高度(只讀)
* 如果元素滾動到底, 下面等式返回true, 沒有則返回false:
* ele.scrollHeight - ele.scrollTop === ele.clientHeight;
*/
const condition = this.scrollHeight - this.scrollTop <= this.clientHeight;
if (condition) {
binding.value();
}
});
}
}
},
data() {
return {
value: ``,
options: [],
formData: {
pageIndex: 1,
pageSize: 20,
}
};
},
mounted() {
this.getList(this.formData);
},
methods: {
loadmore() {
this.formData.pageIndex++;
this.getList(this.formData);
},
getList(formData) {
// 這裡是介面請求資料, 帶分頁條件
const _res = [1, 2, 3]; // 請求得到的資料
this.options = [...this.options, ..._res];
}
}
};
這樣就做到了滾動懶載入, 具體細節在應用時修改.
問題
這樣渲染問題解決了, 隨之會出現一個問題, 就是當你的value
為選中的資料後, 分頁數大的資料.
當頁數小時, options
資料中沒有當前value
的那一個, value
就會顯示為得到的id.
當你選中後你要儲存下來當前的id
以及lable
, 下次過來時, 帶入當前元件, 手動放在options
中,
這樣就解決了這個問題.