el-select數據過多懶加載(loadmore)

el-select數據過多處理方式

在平常項目中el-select組件的使用頻率是很是之高的. 當數據過多時渲染時間很是長, 這裏提供幾個處理方式.element-ui

遠程搜索

組件提供了遠程搜索方式, 也就是按照你輸入的結果匹配選項.ui

下拉懶加載loadMore

下拉懶加載, 當select滾動到底部時, 你再去請求一部分數據, 加入到當前數據中.this

某組件中:code

<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];
        }
    }
};

這樣就作到了滾動懶加載, 具體細節在應用時修改.orm

問題

這樣渲染問題解決了, 隨之會出現一個問題, 就是當你的value爲選中的數據後, 分頁數大的數據.
當頁數小時, options數據中沒有當前value的那一個, value就會顯示爲獲得的id.接口

當你選中後你要保存下來當前的id以及lable, 下次過來時, 帶入當前組件, 手動放在options中,
這樣就解決了這個問題.ip

相關文章
相關標籤/搜索