成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Element 穿梭框性能優化

開發 前端
穿梭框處理大數據量時,由于渲染的 DOM 節點過多,造成頁面卡頓的問題。在盡量不改變組件原有邏輯的前提下,進行優化。

[[415475]]

本文轉載自微信公眾號「微醫大前端技術」,作者陳建波。轉載本文請聯系微醫大前端技術公眾號。

element 穿梭框性能優化

背景

穿梭框處理大數據量時,由于渲染的 DOM 節點過多,造成頁面卡頓的問題。在盡量不改變組件原有邏輯的前提下,進行優化。

解決思路

懶加載 - InfiniteScroll 組件

先從 packages/transfer 中將原組件拷出(或者改源碼重新打包維護私有庫使用

  1. v-infinite-scroll="pageDown" 
  2. :infinite-scroll-immediate="false" 

添加到

  1. <el-checkbox-group 
  2.         v-show="!hasNoMatch && data.length > 0" 
  3.         v-model="checked" 
  4.         :size="size" 
  5.         :class="{ 'is-filterable': filterable }" 
  6.         class="el-transfer-panel__list" 
  7.         v-infinite-scroll="pageDown" 
  8.         :infinite-scroll-immediate="false" 
  9.       > 
  10.         <el-checkbox 
  11.           class="el-transfer-panel__item" 
  12.           :label="item[keyProp]" 
  13.           :disabled="item[disabledProp]" 
  14.           :key="item[keyProp]" 
  15.           v-for="item in filteredData"
  16.             <option-content :option="item"></option-content> 
  17.         </el-checkbox> 
  18. </el-checkbox-group

 

 

在data中定義pageSize: 20 用來表示每頁數據個數showData: [] 僅用來展示使用,替換上述代碼中實際需要操作的數據 filteredData

  1. v-for="item in showData"

同時在watch中相應的處理

  1. data (data) { 
  2.     const checked = []; 
  3.     this.showData = data.slice(0, this.pageSize); 
  4.  
  5.     const filteredDataKeys = this.filteredData.map( 
  6.     (item) => item[this.keyProp] 
  7.     ); 
  8.     this.checked.forEach((item) => { 
  9.     if (filteredDataKeys.indexOf(item) > -1) { 
  10.         checked.push(item); 
  11.     } 
  12.     }); 
  13.     this.checkChangeByUser = false
  14.     this.checked = checked; 
  15. }, 
  16. filteredData (filteredData) { 
  17.     this.showData = filteredData.slice(0, this.pageSize); 
  18.  } 

初始化展示數量隨意這里取 20。

最后添加滾動到底部時調用的方法

  1. pageDown () { 
  2.     const l = this.showData.length; 
  3.     const totalLength = this.filteredData.length 
  4.     l < totalLength &&  
  5.     (this.showData = this.filteredData.slice(0, l + this.pageSize > totalLength ? 
  6.     totalLength : l + this.pageSize)); 
  7. }, 

往下滾動的時候 展示的數據長度增加 20(數量隨意), 超出時展示最大長度。

由此基本解決大數據量操作卡頓的問題。由于展示和邏輯層分開,組件的所有操作邏輯無須修改,最小程度減少差異。

新問題

手動滾動到列表末端,再進行搜索操作依然存在卡頓問題。

進階

在滾動過程中,實際上頂端的數據依舊無法看見,該數據不展示,對用戶體驗也沒有影響, 所以只需展示當前頁的 20 條數據。我們為el-checkbox-group添加一個 ref=scrollContainer 以便操作滾動條,

在data中定義當前頁數 curIndex: 1

并對 pageDown 方法進行修改

  1. pageDown () { 
  2.   const totalLength = this.filteredData.length 
  3.   if((this.curIndex*this.pageSize) < totalLength){ 
  4.     this.curIndex ++ 
  5.     const targetLength = this.curIndex * this.pageSize  
  6.     const endPoint = targetLength > totalLength ? totalLength : targetLength 
  7.     const startPoint = endPoint - this.pageSize  > 0 ? endPoint - this.pageSize : 0 
  8.     this.showData = this.filteredData.slice(startPoint, endPoint); 
  9.     this.$refs.scrollContainer.$el.scrollTop = "1px" //滾動條到最上端,銜接下一頁,為 0 可能會觸發邊界問題 
  10.   } 

為此我們還需要添加向上翻頁的方法 InfiniteScroll 指令 只提供向下滾動,我們可以拓展該指令亦可自行添加上滑滾動監聽

  1. mounted(){ 
  2.         this.$refs.scrollContainer.$el.addEventListener('scroll', this.pageUp) 
  3.     }, 
  4.     beforeDestroy(){ 
  5.         this.$refs.scrollContainer.$el.removeEventListener('scroll', this.pageUp) 
  6.     }, 

注冊pageUp 方法

  1. pageUp(e){ 
  2.       if(e.target.scrollTop ===0 && this.curIndex>1){ 
  3.         this.curIndex -- 
  4.         const endPoint = this.curIndex * this.pageSize  
  5.         const startPoint = (this.curIndex-1)* this.pageSize  
  6.         this.showData = this.filteredData.slice(startPoint, endPoint); 
  7.         const el = this.$refs.scrollContainer.$el 
  8.         el.scrollTop = el.scrollHeight - el.clientHeight - 1 // 滾動到最底部,銜接上一頁, -1 防止邊界問題。 
  9.       } 
  10.     }, 

當進行數據操作的時候,頁面內容變化,滾動條也會隨之變化,為防止不能預知的翻頁,數據改變時,重置滾動條和當前頁碼。

  1. initScroll(){ 
  2.         this.curIndex = 1 
  3.         this.$refs.scrollContainer.$el.scrollTop = 0 
  4.     }, 

同時地,在watch中相應時候執行 initScroll

  1. data(){ 
  2.       ... 
  3.       this.initScroll() 
  4.       ... 
  5.   }, 
  6.   filteredData (filteredData) { 
  7.     ... 
  8.     this.initScroll() 
  9.   } 

 

至此大數據量的穿梭框,性能大為改善。

 

責任編輯:武曉燕 來源: 微醫大前端技術
相關推薦

2025-06-03 00:00:06

性能優化性能指標響應時間

2014-12-10 10:12:02

Web

2011-08-03 16:51:01

jQuery

2013-06-09 15:31:35

jQueryjQuery優化性能優化

2017-08-08 09:45:43

Python性能優化

2009-06-16 16:10:59

Hibernate性能

2020-09-19 21:26:56

webpack

2009-09-08 09:45:23

App Engine性

2022-02-16 14:10:51

服務器性能優化Linux

2021-11-29 11:13:45

服務器網絡性能

2021-05-10 08:08:25

工具LightHouse性能優化

2021-05-12 06:02:56

性能優化工具WebPageTest

2021-07-29 14:20:34

網絡優化移動互聯網數據存儲

2020-10-19 19:45:58

MySQL數據庫優化

2019-11-01 14:00:58

前端性能優化代碼

2013-09-16 15:16:20

Android性能優化

2010-03-02 09:53:14

MySQL性能優化

2017-07-14 10:51:37

性能優化SQL性能分析

2013-12-17 16:21:17

iOSiOS性能優化

2023-11-19 23:24:21

Golang開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品毛片一区二区三区 | www.蜜桃av| 久久久九九九九 | 91p在线观看 | 亚洲国产成人精品女人久久久 | 9191av| 视频一区二区中文字幕 | 色综合天天综合网国产成人网 | 午夜天堂| 日本精品一区二区三区在线观看视频 | 欧美一区二区三区久久精品 | 看一级黄色毛片 | 亚洲黄色片免费观看 | 精品国产乱码久久久久久丨区2区 | 国产成人精品一区二区 | 国产999精品久久久久久 | 夜夜爽99久久国产综合精品女不卡 | 日本黄视频在线观看 | 日韩精品久久一区二区三区 | 国产福利在线视频 | 日本一卡精品视频免费 | 视频在线一区 | 色吊丝2288sds中文字幕 | 成人精品一区二区三区 | 国产高清一区二区 | 99免费视频 | 日本精品在线一区 | 综合久久一区 | 日韩一级欧美一级 | 国产高清自拍视频在线观看 | 国产在线不卡 | 91久久久久久久久久久 | 亚洲风情在线观看 | 欧美日韩在线一区二区三区 | 午夜视频免费在线 | 国产精品一区在线 | 婷婷综合五月天 | 久久精品播放 | 91久久精品国产 | 99亚洲精品| 亚洲精品二三区 |