欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

element-ui中select下拉框加載大數(shù)據(jù)渲染優(yōu)化方式

 更新時間:2023年11月09日 10:16:03   作者:donggua_123  
這篇文章主要介紹了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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vuex項目中登錄狀態(tài)管理的實踐過程

    vuex項目中登錄狀態(tài)管理的實踐過程

    由于狀態(tài)零散地分布在許多組件和組件之間的交互中,大型應(yīng)用復(fù)雜度也經(jīng)常逐漸增長,為了解決這個問題,Vue 提供 vuex,這篇文章主要給大家介紹了關(guān)于vuex項目中登錄狀態(tài)管理的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • 如何優(yōu)雅的在一臺vps(云主機(jī))上面部署vue+mongodb+express項目

    如何優(yōu)雅的在一臺vps(云主機(jī))上面部署vue+mongodb+express項目

    這篇文章主要介紹了如何優(yōu)雅的在一臺vps(云主機(jī))上面部署vue+mongodb+express項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • vue3.0中使用element的完整步驟

    vue3.0中使用element的完整步驟

    這篇文章主要給大家介紹了關(guān)于vue3.0中使用element的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • vue配置font-awesome5的方法步驟

    vue配置font-awesome5的方法步驟

    這篇文章主要介紹了vue配置font-awesome5的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • vue computed的set方法無效問題及解決

    vue computed的set方法無效問題及解決

    這篇文章主要介紹了vue computed的set方法無效問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 關(guān)于Vue3&TypeScript的踩坑匯總

    關(guān)于Vue3&TypeScript的踩坑匯總

    這篇文章主要介紹了關(guān)于Vue3&TypeScript的踩坑匯總,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue新搭檔TypeScript快速入門實踐記錄

    Vue新搭檔TypeScript快速入門實踐記錄

    TypeScript 是一種由微軟開發(fā)的自由和開源的編程語言,它是 JavaScript 的一個超集,擴(kuò)展了 JavaScript 的語法。這篇文章主要介紹了Vue新搭檔TypeScript快速入門實踐,需要的朋友可以參考下
    2021-06-06
  • vue.js vue-router如何實現(xiàn)無效路由(404)的友好提示

    vue.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-12
  • 為什么vue中不建議使用空字符串作為className

    為什么vue中不建議使用空字符串作為className

    本文主要介紹了為什么vue中不建議使用空字符串作為className,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Element-UI日期選擇器(選擇日期范圍)禁用未來日期實現(xiàn)代碼

    Element-UI日期選擇器(選擇日期范圍)禁用未來日期實現(xiàn)代碼

    我們在網(wǎng)頁開發(fā)時通常需要用到一些日期組件來方便用戶選擇時間,其中element日期組件是一個非常好用的工具,這篇文章主要給大家介紹了關(guān)于Element-UI日期選擇器(選擇日期范圍)禁用未來日期的相關(guān)資料,需要的朋友可以參考下
    2024-02-02

最新評論