最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談ElementUI el-select 數(shù)據(jù)過多解決辦法

 更新時(shí)間:2021年09月13日 10:48:27   作者:張賀_  
下拉框的選項(xiàng)很多,上萬個(gè)選項(xiàng)甚至更多,這個(gè)時(shí)候如果全部把數(shù)據(jù)放到下拉框中渲染出來,瀏覽器會(huì)卡死,體驗(yàn)會(huì)特別不好,本文主要介紹了ElementUI el-select 數(shù)據(jù)過多解決辦法,感興趣的可以了解一下

1. 場景描述

不知道你有沒有這樣的經(jīng)歷,下拉框的選項(xiàng)很多,上萬個(gè)選項(xiàng)甚至更多,這個(gè)時(shí)候如果全部把數(shù)據(jù)放到下拉框中渲染出來,瀏覽器會(huì)卡死,體驗(yàn)會(huì)特別不好

用人會(huì)說element-ui的select有一個(gè)remote-method,支持遠(yuǎn)程搜索,我們讓服務(wù)端支持一下不就可以了,當(dāng)然這是一種解決的方案。但是有時(shí)候這種方法有時(shí)候不一定適用

(1)有時(shí)候服務(wù)端數(shù)據(jù)是經(jīng)過計(jì)算返回給我們的,可能返回不是特別快,體驗(yàn)不是很好
(2)有時(shí)候數(shù)據(jù)可能只有幾千條,全部渲染又不太合適,一直掉接口不是特別好
(3)僅僅通過前端能不能解決,如果能解決,豈不是減輕了服務(wù)端的工作和壓力

2.解決辦法

1 ) 分段加載:也不加載下拉項(xiàng),通過點(diǎn)擊下拉框的時(shí)候,再去加載,此時(shí)的選項(xiàng)全部加載進(jìn)來,該種情況只適用于緩加載情況,需要點(diǎn)擊加載完后才能下拉選項(xiàng),體驗(yàn)一般。
2 )提示:element-ui的select有一個(gè)filter-method方法,我們可以通過這個(gè)方法來進(jìn)行過濾下拉項(xiàng)
假設(shè)我們有個(gè)下拉框是用來選擇用戶的

<el-select
  v-model="userId"
  filterable
  :filter-method="userFilter"
  clearable>
  <el-option
    v-for="item in userList"
    :key="item.userId"
    :label="item.username"
    :value="item.userId"
  ></el-option>
</el-select>
userFilter(query = '') {
  let arr = this.allUserList.filter((item) => {
    return item.username.includes(query) || item.userId.includes(query)
  })
  if (arr.length > 50) {
    this.userList = arr.slice(0, 50)
  } else {
    this.userList = arr
  }
},
getUserWhiteList() {
  HttpRequest.post("/api/admin/community/getUserWhiteList").then(
    response => {
      this.allUserList = response.data.list;
      this.userFilter()
    }
  );
},

如上所示,我們從后臺(tái)獲取用戶列表,經(jīng)過我們自己的過濾,我們每次只渲染50條數(shù)據(jù),無論有多少數(shù)據(jù),對我們來說也支持一個(gè)變量,占個(gè)內(nèi)存。當(dāng)然數(shù)據(jù)越多,數(shù)組的遍歷也會(huì)相應(yīng)的慢,但是這個(gè)影響不大。
我們不僅能過濾名字,還可以對我們制定的任一項(xiàng)進(jìn)行過濾
優(yōu)化:上面的代碼我們還可以適當(dāng)優(yōu)化下,只有發(fā)現(xiàn)了數(shù)組長度超過了50項(xiàng),我們就停止遍歷

 el-select組件的options條數(shù)過多時(shí)的解決方案

 業(yè)務(wù)場景

當(dāng)使用el-select組件時(shí),如果options數(shù)量過多,會(huì)存在的弊端:

頁面渲染出大量el-option節(jié)點(diǎn),會(huì)導(dǎo)致頁面卡頓甚至卡死,用戶體驗(yàn)極差。
選擇時(shí)條目眾多,查找困難。

本次我遇到的場景是options數(shù)量為6-9千的情況。

解決思路

從總options中取出固定條目的小option(renderOption)用于頁面渲染,利用el-select提供的
filter-method方法進(jìn)行搜索過濾,在搜索時(shí)用過濾結(jié)果更新renderOption。

代碼實(shí)現(xiàn)
下面是vue的組件封裝

<template>
    <el-select
        class="yt-select"
        v-model="currValue"
        filterable
        v-bind="$attrs"
        :filter-method="userFilter"
        :disabled="disabled"
        :clearable="clearable"
        @change="change"
    >
        <el-option
            v-for="option in renderOption"
            :key="option.value"
            :value="option.value"
            :label="option.label"
        >{{ option.label }}</el-option>
    </el-select>
</template>

<script>

export default {
    name: 'easy-select',
    props: {
        value: {
            type: [String, Number],
            default: ''
        },
        max: {
            type: Number,
            default: 30
        },
        disabled: {
            type: Boolean,
            default: false
        },
        clearable: {
            type: Boolean,
            default: true
        },
        options: {
            type: Array,
            default: () => []
        }
    },
    data () {
        return {
            renderOption: []
        }
    },
    computed: {
        currValue: {
            get () {
                return this.value || ''
            },
            set (value) {
                this.$emit('input', value)
            }
        }
    },
    watch: {
        value () {
            this.addValueOptions()
        },
        options: {
            handler (V) {
                this.init()
            },
            deep: true
        }
    },
    created () {
        this.init()
    },
    methods: {
        async init () {
            this.userFilter()
            this.addValueOptions()
        },
        addValueOptions () {
            if (this.currValue) {
                let target = this.options.find((item) => { // 從大option中找到當(dāng)前條
                    return item.value === this.currValue
                })
                if (target) { // 將當(dāng)前條與小option比對,沒有則加入
                    if (this.renderOption.every(item => item.value !== target.value)) {
                        this.renderOption.unshift(target)
                    }
                }
            }
        },
        addFilterOptions (label) {
         // 每次查找輸入時(shí),若有精確匹配的條目,保證該條目一定在renderOption內(nèi)
            let target = this.options.find((item) => { // 從大option中找到當(dāng)前條
                return item.label === label
            })
            if (target) { // 將當(dāng)前條與小option比對,沒有則加入
                if (this.renderOption.every(item => item.label !== target.label)) {
                    this.renderOption.unshift(target)
                }
            }
        },
        userFilter (query = '') {
            let arr = this.options.filter((item) => {
                return item.label.includes(query) || item.value.includes(query)
            })
            if (arr.length > this.max) {
                this.renderOption = arr.slice(0, this.max)
                this.addFilterOptions(query)
            } else {
                this.renderOption = arr
            }
        },
        change (value) {
            this.$emit('change', value)
            if (!value) { // 單選清空-optons初始化下
                this.userFilter()
            }
        }
    }
}
</script>

注意事項(xiàng)

  • 初始化和value值變化時(shí),需要找到value對應(yīng)具體項(xiàng),并加入renderOptions
  • 搜索時(shí),可能過濾到的n條數(shù)據(jù)都沒有包含用戶想找的具體項(xiàng),因此,過濾時(shí)需要進(jìn)行一下精確查找,將匹配項(xiàng)放入renderOptions頭部

到此這篇關(guān)于ElementUI el-select 數(shù)據(jù)過多解決辦法的文章就介紹到這了,更多相關(guān)ElementUI el-select 數(shù)據(jù)過多內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue中UI組件庫之Vuex與虛擬服務(wù)器初識(shí)

    Vue中UI組件庫之Vuex與虛擬服務(wù)器初識(shí)

    這篇文章主要介紹了Vue中UI組件庫之Vuex與虛擬服務(wù)器初識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • 一文詳細(xì)分析Vue3中的emit用法(子傳父)

    一文詳細(xì)分析Vue3中的emit用法(子傳父)

    Emit是Vue3中另一種常見的組件間傳值方式,它通過在子組件中觸發(fā)事件并將數(shù)據(jù)通過事件參數(shù)傳遞給父組件來實(shí)現(xiàn)數(shù)據(jù)傳遞,這篇文章主要給大家介紹了關(guān)于詳細(xì)分析Vue3中emit用法(子傳父)的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • Vue+elementUI導(dǎo)出word打印方式

    Vue+elementUI導(dǎo)出word打印方式

    這篇文章主要介紹了Vue+elementUI導(dǎo)出word打印方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Vue實(shí)現(xiàn)視頻播放vue-video-player、dplayer方式

    Vue實(shí)現(xiàn)視頻播放vue-video-player、dplayer方式

    這篇文章主要介紹了Vue實(shí)現(xiàn)視頻播放vue-video-player、dplayer方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • vue3.0翻牌數(shù)字組件使用方法詳解

    vue3.0翻牌數(shù)字組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了vue3.0翻牌數(shù)字組件使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue2.0s中eventBus實(shí)現(xiàn)兄弟組件通信的示例代碼

    vue2.0s中eventBus實(shí)現(xiàn)兄弟組件通信的示例代碼

    這篇文章主要介紹了vue2.0s中eventBus實(shí)現(xiàn)兄弟組件通信的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • axios 實(shí)現(xiàn)post請求時(shí)把對象obj數(shù)據(jù)轉(zhuǎn)為formdata

    axios 實(shí)現(xiàn)post請求時(shí)把對象obj數(shù)據(jù)轉(zhuǎn)為formdata

    今天小編就為大家分享一篇axios 實(shí)現(xiàn)post請求時(shí)把對象obj數(shù)據(jù)轉(zhuǎn)為formdata,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • Vue?mergeProps用法詳細(xì)講解

    Vue?mergeProps用法詳細(xì)講解

    這篇文章主要介紹了Vue?mergeProps用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • Vue加載中動(dòng)畫組件使用方法詳解

    Vue加載中動(dòng)畫組件使用方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue加載中動(dòng)畫組件使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vant主題定制如何修改顏色樣式

    Vant主題定制如何修改顏色樣式

    這篇文章主要介紹了Vant主題定制如何修改顏色樣式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04

最新評論

阿图什市| 栾城县| 上林县| 新龙县| 杭锦旗| 汉阴县| 南华县| 根河市| 环江| 共和县| 乌鲁木齐市| 汉阴县| 锡林郭勒盟| 长岭县| 星座| 井陉县| 施秉县| 巩留县| 布拖县| 承德市| 临桂县| 昭通市| 广安市| 凤山市| 石嘴山市| 申扎县| 宜黄县| 齐齐哈尔市| 蒲城县| 阿克陶县| 麻城市| 泾川县| 大庆市| 铁岭市| 林口县| 鲁山县| 叶城县| 靖西县| 亚东县| 阳春市| 胶州市|