亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解決el-select數(shù)據(jù)量過(guò)大的3種方案

 更新時(shí)間:2023年09月14日 08:39:27   作者:searchop  
最近做完一個(gè)小的后臺(tái)管理系統(tǒng),快上線了,發(fā)現(xiàn)一個(gè)問(wèn)題,有2個(gè)select的選項(xiàng)框線上的數(shù)據(jù)量是1w+,而測(cè)試環(huán)境都是幾百的,所以導(dǎo)致頁(yè)面直接卡住了,本文給大家總結(jié)了3種方法,需要的朋友可以參考下

背景

最近做完一個(gè)小的后臺(tái)管理系統(tǒng),快上線了,發(fā)現(xiàn)一個(gè)問(wèn)題,有2個(gè)select的選項(xiàng)框線上的數(shù)據(jù)量是1w+。。而測(cè)試環(huán)境都是幾百的,所以導(dǎo)致頁(yè)面直接卡住了,over了。

想了一下,如果接口支持搜索和分頁(yè),那直接通過(guò)上拉加載就可以了。但后端不太愿意改??。行吧,前端搞也是可以的。

方案

通過(guò)一頓搜索加聯(lián)想總結(jié)了3種方法,以下方法都需要支持開(kāi)啟filterable支持搜索。

標(biāo)題具體問(wèn)題
方案1只展示前100條數(shù)據(jù),這個(gè)的話配合filter-method每次只返回前100條數(shù)據(jù)。限制展示的條數(shù)可能不全,搜索需要多搜索點(diǎn)內(nèi)容
方案2分頁(yè)方式,通過(guò)指令實(shí)現(xiàn)上拉加載,不斷上拉數(shù)據(jù)展示數(shù)據(jù)。僅過(guò)濾加載出來(lái)的數(shù)據(jù),需要配合filterMethod過(guò)濾數(shù)據(jù)
方案3options列表采用虛擬列表實(shí)現(xiàn)。成本高,需要引入虛擬列表組件或者自己手寫(xiě)

方案一,青銅段位 filterMethod直接過(guò)濾數(shù)據(jù)量

<template>
    <el-select 
      v-model="value" 
      clearable filterable 
      :filter-method="filterMethod">
      <el-option
        v-for="(item, index) in options.slice(0, 100)"
        :key="index"
        :label="item.label"
        :value="item.value">
      </el-option>
    </el-select>
 </template>
 export default {
  name: 'Demo',
  data() {
    return {
      options: [],
      value: ''
    }
  },
  beforeMount() {
    this.getList();
  },
  methods: {
    // 模擬獲取大量數(shù)據(jù)
    getList() {
      for (let i = 0; i < 25000; i++) {
        this.options.push({label: "選擇"+i,value:"選擇"+i});
      } 
    },
    filterMethod(val) {
      console.log('filterMethod', val);
      this.options = this.options.filter(item => item.value.indexOf(val) > -1).slice(0, 100);
    },
    visibleChange() {
      console.log('visibleChange');
    }
  }
}

方案二、 白銀段位 自定義滾動(dòng)指令,實(shí)現(xiàn)翻頁(yè)加載

寫(xiě)自定義滾動(dòng)指令,options列表滾動(dòng)到底部后,再加載下一頁(yè)。但這時(shí)候篩選出來(lái)的是已經(jīng)滾動(dòng)出來(lái)的值。

這里如果直接使用filterable來(lái)搜索,搜索出來(lái)的內(nèi)容是已經(jīng)滑動(dòng)出來(lái)的內(nèi)容。如果想篩選全部的,就需要重寫(xiě)filterMethod方法來(lái)自定義過(guò)濾功能??梢愿鶕?jù)情況選擇是否要重寫(xiě)filterMethod。

<template>
  <div class="dashboard-editor-container">
    <el-select 
      v-model="value" 
      clearable
      filterable 
      v-el-select-loadmore="loadMore"
      :filter-method="filterMethod">
      <el-option
        v-for="(item, index) in options"
        :key="index"
        :label="item.label"
        :value="item.value">
      </el-option>
    </el-select>
  </div>
</template>
<script>
export default {
  name: 'Demo',
  data() {
    return {
      options: [],
      value: '',
      pageNo: 0
    }
  },
  beforeMount() {
    this.getList();
  },
  methods: {
    // 模擬獲取大量數(shù)據(jù)
    getList() {
      const data = [];
      for (let i = 0; i < 25000; i++) {
        data.push({label: "選擇"+i,value:"選擇"+i});
      }
      this.allData = data;
      this.data = data;
      this.getPageList()
    },
    getPageList(pageSize = 10) {
      this.pageNo++;
      const list = this.data.slice(0, pageSize * (this.pageNo));
      this.options = list;
    },
    loadMore() {
      this.getPageList();
    },
    filterMethod(val) {
      this.data = val ? this.allData.filter(item => item.label.indexOf(val) > -1) : this.allData;
      this.getPageList();
    }
  },
  directives:{
    'el-select-loadmore':(el, binding) => {
      // 獲取element-ui定義好的scroll父元素
      const wrapEl = el.querySelector(".el-select-dropdown .el-select-dropdown__wrap");
      if(wrapEl){
        wrapEl.addEventListener("scroll", function () {
          /**
           * scrollHeight 獲取元素內(nèi)容高度(只讀)
           * scrollTop 獲取或者設(shè)置元素的偏移值,
           *  常用于:計(jì)算滾動(dòng)條的位置, 當(dāng)一個(gè)元素的容器沒(méi)有產(chǎn)生垂直方向的滾動(dòng)條, 那它的scrollTop的值默認(rèn)為0.
           * clientHeight 讀取元素的可見(jiàn)高度(只讀)
           * 如果元素滾動(dòng)到底, 下面等式返回true, 沒(méi)有則返回false:
           * ele.scrollHeight - ele.scrollTop === ele.clientHeight;
           */
          if (this.scrollTop + this.clientHeight >= this.scrollHeight) {
            // binding的value就是綁定的loadmore函數(shù)
            binding.value();
          }
        });
      }
    },
  },
}
</script>
</script>

方案三、黃金段位- 虛擬列表

引入社區(qū)的vue-virtual-scroll-list 支持虛擬列表。但這里想的自己再實(shí)現(xiàn)一遍虛擬列表,后續(xù)再寫(xiě)吧。

<template>
  <div class="dashboard-editor-container">
    <el-select 
      v-model="value" 
      clearable
      filterable >
      <virtual-list
          class="list"
          style="height: 360px; overflow-y: auto;"
          :data-key="'value'"
          :data-sources="data"
          :data-component="item"
          :estimate-size="50"
        />
    </el-select>
  </div>
</template>
<script>
import VirtualList from 'vue-virtual-scroll-list';
import Item from './item';
export default {
  name: 'Demo',
  components: {VirtualList, Item},
  data() {
    return {
      options: [],
      data: [],
      value: '',
      pageNo: 0,
      item: Item,
    }
  },
  beforeMount() {
    this.getList();
  },
  methods: {
    // 模擬獲取大量數(shù)據(jù)
    getList() {
      const data = [];
      for (let i = 0; i < 25000; i++) {
        data.push({label: "選擇"+i,value:"選擇"+i});
      }
      this.allData = data;
      this.data = data;
      this.getPageList()
    },
    getPageList(pageSize = 10) {
      this.pageNo++;
      const list = this.data.slice(0, pageSize * (this.pageNo));
      this.options = list;
    },
    loadMore() {
      this.getPageList();
    }
  }
}
</script>
// item組件
<template>
    <el-option :label="source.label" :value="source.value"></el-option>
</template>
  <script>
  export default {
    name: 'item',
    props: {
      source: {
        type: Object,
        default() {
          return {}
        }
      }
    }
  }
  </script>
  <style scoped>
  </style>

總結(jié)

最后我們項(xiàng)目中使用的虛擬列表,為啥,因?yàn)楹鋈话l(fā)現(xiàn)組件庫(kù)支持select是虛擬列表,那就直接使用這個(gè)啦。

以上就是解決el-select數(shù)據(jù)量過(guò)大的3種方案的詳細(xì)內(nèi)容,更多關(guān)于el-select數(shù)據(jù)量過(guò)大的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于eslint和prettier格式化沖突問(wèn)題

    關(guān)于eslint和prettier格式化沖突問(wèn)題

    這篇文章主要介紹了eslint和prettier格式化沖突問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • 基于vue和bootstrap實(shí)現(xiàn)簡(jiǎn)單留言板功能

    基于vue和bootstrap實(shí)現(xiàn)簡(jiǎn)單留言板功能

    這篇文章主要為大家詳細(xì)介紹了基于vue和bootstrap實(shí)現(xiàn)簡(jiǎn)單留言板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • VUE3中Element table表頭動(dòng)態(tài)展示合計(jì)信息

    VUE3中Element table表頭動(dòng)態(tài)展示合計(jì)信息

    本文主要介紹了在Vue中實(shí)現(xiàn)動(dòng)態(tài)合計(jì)兩個(gè)字段并輸出摘要信息的方法,通過(guò)使用監(jiān)聽(tīng)器和深度監(jiān)聽(tīng),確保當(dāng)數(shù)據(jù)變化時(shí)能正確更新合計(jì)結(jié)果,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-11-11
  • vue3項(xiàng)目如何國(guó)際化實(shí)戰(zhàn)指南

    vue3項(xiàng)目如何國(guó)際化實(shí)戰(zhàn)指南

    像很多大型的網(wǎng)址,特別是跨國(guó)際等公司網(wǎng)頁(yè),訪問(wèn)來(lái)自世界各地用戶,所以網(wǎng)頁(yè)的國(guó)際化極其重要的需求,下面這篇文章主要給大家介紹了關(guān)于vue3項(xiàng)目如何國(guó)際化的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 詳解Vue取消eslint語(yǔ)法限制

    詳解Vue取消eslint語(yǔ)法限制

    本篇文章給大家分享了Vue取消eslint語(yǔ)法限制的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們可以參考學(xué)習(xí)下。
    2018-08-08
  • Vue-resource安裝過(guò)程及使用方法解析

    Vue-resource安裝過(guò)程及使用方法解析

    這篇文章主要介紹了Vue-resource安裝過(guò)程及使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • 在Linux服務(wù)器上部署vue項(xiàng)目

    在Linux服務(wù)器上部署vue項(xiàng)目

    這篇文章介紹了在Linux服務(wù)器上部署vue項(xiàng)目的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • vue彈窗消息組件的使用方法

    vue彈窗消息組件的使用方法

    這篇文章主要為大家詳細(xì)介紹了vue彈窗消息組件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • elementui?el-calendar日歷組件使用示例

    elementui?el-calendar日歷組件使用示例

    這篇文章主要為大家介紹了elementui?el-calendar日歷組件使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Vue3 Vant組件庫(kù)使用過(guò)程中的避坑點(diǎn)

    Vue3 Vant組件庫(kù)使用過(guò)程中的避坑點(diǎn)

    本片文章主要寫(xiě)了,Vue3開(kāi)發(fā)時(shí)運(yùn)用Vant UI庫(kù)的一些避坑點(diǎn)。讓有問(wèn)題的小伙伴可以快速了解是為什么。也是給自己做一個(gè)記錄
    2023-04-04

最新評(píng)論