日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

如何讓vue長列表快速加載

瀏覽:24日期:2022-10-01 09:04:19

vue-long-list-load,滿足特殊條件的長列表加載。支持:1、各個節點高度不同且可自由設定 2、各個節點可修改不影響加載效果 3、可精確的滾動到指定位置。

背景

有個長列表渲染的需求,本來用vue-virtual-scroll-list的。但是每個節點的高度不一樣,用著有點問題。如果也有相應的需求可以參考下我的方案。歡迎大家交流!

vue-long-list-load

滿足特殊條件的的長列表加載。 列表內各個節點高度不一,各個節點可以進行修改,定位到指定位置指定節點。 www.npmjs.com/package/vue…

主要內容 vue-long-list-load 與 vue-virtual-scroll-list 對比 vue-long-list-load實現思路 基本代碼 插件使用方式 插件參數說明 一、組件對比

vue-long-list-load ,vue-virtual-scroll-list兩個插件各有優缺點,當我們在選擇插件的時候要選擇最適合應用場景的插件。下面是兩個插件的基本功能對比。vue-long-list-load 主要特點是適用于各個節點尺寸不統一的場景,vue-virtual-scroll-list更適用于高度統一節點以列表長度以w計的這種列表。

組件 vue-long-list-load vue-virtual-scroll-list npm地址 www.npmjs.com/package/vue… www.npmjs.com/package/vue… 核心 先空dom占位,顯示區域內組件掛載顯示 計算當前顯示區域內要顯示的組件掛載 橫向 支持 支持 列表內高度一致 支持 支持 列表內高度不一致 支持 支持不好 滾動到指定組件 支持 高度不一致時計算不準確 滾動事件 支持 支持 組件高度改變事件 支持 支持 隱藏組件 支持 不支持 二、實現思路

主要思想就是通過color{red}{虛擬dom}虛擬dom占位各個節點,根據可顯示視口的變化來展示該展示的節點。影響可顯示視口的因素的監聽,頁面整體寬高變化、節點高度變化、頁面的滾動定位到某一個節點等都可能會影響到視口的變化。當視口發生變化后計算可顯示的節點,將可顯示的節點掛載上節點的組件,不在視口內的節點銷毀組件緊保留一個空的div。下圖為實現思路的流程圖。

如何讓vue長列表快速加載

三、關鍵方法源碼分析

主入口html結構如下,color{red}{v-for}v−for 展示長列表長度的的節點,并且通過:style 來設置一個color{red}{最小高度}最小高度,設置最小高度的原因是這個高度值可能不準確,當真正組件渲染完之后計算出最準確的高度,如果直接height的話可能會使節點內的組件展示不全。同時每個節點設置唯一id(scrollItem_ 唯一標識),在根據數據獲取dom信息時候使用。節點組件定義了唯一的class (long-item- 唯一標識),主要用來掛載真實列表組件,同時監聽組件的高度變化。showList[index]來控制節點是否時候顯示的唯一標識。

<!--html代碼--> <template> <div : : :key='item[dataKey]' : v-for='(item,index) in dataList' > <long-item v-if='showList[index]':dataKey='dataKey' :item='item':boxHeight='item.height||0':direction='direction':heightChange='heightChange':extendCcomments='extendCcomments'> </long-item> </div> </template>

當showList[index]為true的時候,對應的節點顯示。long-item 在mounted生命周期時,回調extendCcomments。通過color{red}{Vue.extend Profile}Vue.extendProfile掛載到對應的dom上。componentProps是節點組件傳過來的一些參數,在掛載的時候全部掛載上。

<!--掛載組件--> extendCcomments(item){ this.componentProps.item=item var Profile = Vue.extend(this.dataComponent);// 創建 Profile 實例,并掛載到一個元素上new Profile({ propsData:this.componentProps} ).$mount(’.long-item-’+item[this.dataKey]); }

通過color{red}{element-resize-detector}element−resize−detector來監聽dom尺寸的變化,每個節點的寬高發生變化的時候,并且與原來的尺寸不一樣回調heightChange方法,進行尺寸的更新及顯示節點的操作計算。

<!--每個節點尺寸發生變化--> this.$nextTick(()=> { this.$DomListener.listenTo(document.getElementById(’long-item-’+this.item[this.dataKey]), (element)=>{ if(this.boxHeight != element[this.directionConfig.width]){this.heightChange(this.item, element[this.directionConfig.width]) } }) });

獲取可顯示的視口區域的方法,頁面滾動和尺寸變化都會調用到這個方法,所以這個方法在調用的時候做防抖處理300ms內有連續調用只會執行最后一次調用,要不然會頻繁計算影響性能??娠@示視口區域計算方式是當前視口 及 前后兩個視口總共三個視口的尺寸。這樣在小的滾動范圍內會有較好的體驗。

getShowLimit(startTop) { const scrollTop = startTop || this.scrollWrap[this.directionConfig.scrollTo] || 0; // 滾動距離 this.viewClientHeight = this.scrollWrap[this.directionConfig.width]; // 可視區域高度 this.scrollTop = scrollTop this.showStart = scrollTop - this.viewClientHeight this.showEnd = scrollTop + 2*this.viewClientHeight if(this.setTopTimer){ clearTimeout(this.setTopTimer) } this.setTopTimer = setTimeout(() => { this.setItemTopheight() }, 300); },

根據高度或者寬度來計算節點是否顯示,因為這個計算量比較大避免而且這個方法與其他方法沒有什么關聯,直接單獨開一個color{red}{獨立線程}獨立線程進行計算。通過引入color{red}{simple-web-worker}simple−web−worker這個插件單獨開一個線程進行計算顯示節點。計算方法主要有三點:當前節點的開頭在顯示視口內、當前節點的結尾在顯示視口內、當前節點開頭和結尾都不在顯示視口內。分為這三種情況,只要滿足一種情況,則該節點就顯示在顯示視口中。

// 根據高度計算節點是否顯示 setItemTopheight(){ let stsartId = this.dataList[0]&&this.dataList[0][this.dataKey] let startDom = stsartId && document.getElementById(’scrollItem_’+stsartId) let startTop = startDom ? startDom[this.directionConfig.offset] : 0 this.worker = this.$worker.run((dataList,showStart,showEnd, startTop,hideIds,dataKey,height) =>{ let topHeight = startTop; // 題目頂部距離頂部距離 let bottomHeight = 0; // 題目底部距離頂部距離 let showList = [] for(let i=0,len=dataList.length;i<len;i++){let item = dataList[i]if(hideIds.indexOf(item[dataKey]) != -1){ showList[i] = false; continue;}bottomHeight = topHeight + (item.height>=0?item.height:height)// 判斷 1.題目頂部在顯示范圍內 2.題目底部在顯示范圍內 3.題目頂部和底部都不在顯示范圍內 if((topHeight>=showStart && topHeight<=showEnd)|| (bottomHeight>=showStart && bottomHeight<=showEnd)|| (topHeight<showStart && bottomHeight>showEnd) ){ showList[i] = true} else{ showList[i] = false} topHeight += ((item.height>=0?item.height:height)); } return showList }, [this.dataList, this.showStart, this.showEnd, startTop, this.hideIds,this.dataKey,this.height]) .then(res => { this.showList = res }) this.worker = null },四、使用方式

安裝vue-long-list-load:

npm install vue-long-list-load --save

項目內調用

<long-list ref='vueLongList' dataKey=’id’ scrollWrap :dataList='dataList' :dataComponent='dataComponent' :componentProps='componentProps' height=100 > </long-list>五、參數說明 參數 說明 類型 必填 可選值 默認值 scrollWrapId 列表滾動容器id string true — — dataKey 節點數據內唯一鍵值 String true — — dataList 列表數據 Array true 具體見下方說明 — dataComponent 自定義的節點組件 — true — — ref 調用組件內部方法 string false — — direction 滾動方向 Number false 0:縱向,1橫向 0 hideIds 列表中需要隱藏的節點 Array false 具體見下方說明 [] height 節點高度 Number false — 100 componentProps 節點組件要傳遞的參數 Object false — {} scroll 滾動區域內滾動回調方法 Function false - — resized 某個節點寬高發生變化回調方法 Function false 具體見下方說明

部分參數說明

&lt;--假設 dataKey=id--> &lt;--列表中需要隱藏的節點--> hideIds:[1, 2] &lt;--列表數據 dataList 內 height 為 **Number**。--> dataList:[ {id:1,height:100}, {id:2,height:200}, {id:3,height:300}, {id:4,height:300}, {id:5,height:300} ] &lt;--節點高度--> height:100 &lt;--如果dataList的數據內有height值 不需要設置這個height--> &lt;--如果dataList 和 height 都不傳遞的話,默認為100 可能滾動略有卡頓;--> &lt;--建議在每個高度都不相同的時候通過dataList傳遞,都相同時候通過height傳遞--> &lt;--某個節點寬高發生變化回調方法 返回參數為id 與高度--> resized(id, height){ }總結

項目中實踐數據,基本每個節點至少500個dom節點,平均也在800個dom節點以上,用vue-long-list-load 不在渲染區域內的題目只會渲染2個dom節點。按正常800左右個dom節點的題目計算 一般渲染區域渲染的節點在9個左右,如果是n節點的列表 ,每次加載 dom操作都減少(n-9)x(800-2)個dom的渲染,如果color{red}{1000個節點}1000個節點的列表每次加載和操作的時候相當于減少了color{red}{726180}726180個dom節點的渲染。首次渲染還有修改后的重繪都大大減少了dom的渲染加快了加載速度提高了用戶體驗。 此方案已經在項目中實踐一段時間,用戶反饋很好。如果大家也有類似的場景需求,歡迎大家使用!交流!

以上就是如何讓vue長列表快速加載的詳細內容,更多關于vue 長列表快速加載的資料請關注好吧啦網其它相關文章!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人午夜毛片| 亚洲一区国产一区| 国产无遮挡裸体免费久久| 亚洲精品系列| 亚洲久久一区| 日韩三级一区| 欧美一区=区三区| 国产日产精品_国产精品毛片 | 在线日韩成人| 在线看片日韩| 欧美亚洲综合视频| 国产精品美女在线观看直播| 国产成人免费| 99久久婷婷| 国产精品美女| 四虎国产精品免费久久| 亚洲另类视频| 久久精品国产99国产| 久久亚洲道色| 日韩黄色大片网站| 亚洲一级特黄| 视频在线观看一区| 日韩欧美2区| 久久wwww| 日韩网站中文字幕| 视频一区欧美精品| 日韩高清三区| 久久久国产精品网站| 国产美女高潮在线观看| 激情欧美一区二区三区| 亚洲精品字幕| 欧美成人aaa| 久久久久国产精品一区三寸| 99xxxx成人网| 亚欧洲精品视频在线观看| 欧美三区不卡| 中文在线а√在线8| 红桃视频亚洲| 国产伦理一区| 99精品在线免费在线观看| 亚洲精品三级| 久久激情av| 久久精品青草| 亚洲1区在线| 亚洲精品**中文毛片| 午夜在线视频观看日韩17c| 欧美日本三区| 色婷婷狠狠五月综合天色拍| 亚洲综合国产| 久久三级中文| 羞羞答答国产精品www一本| 国产欧美自拍一区| 久久婷婷激情| 奇米色欧美一区二区三区| 高清不卡亚洲| 日韩av不卡一区二区| 色偷偷色偷偷色偷偷在线视频| 久久性天堂网| 91一区二区三区四区| 亚洲激情另类| 日韩av在线中文字幕| 国产精品久久久久久久久久久久久久久 | 日本特黄久久久高潮| 日韩免费福利视频| 国产日韩欧美三区| 蜜臀av国产精品久久久久| 欧美天堂视频| 久久精品系列| 日韩福利视频导航| 中文字幕一区二区三区在线视频| 99视频精品视频高清免费| 激情不卡一区二区三区视频在线| 91精品啪在线观看国产18| 精品久久影院| 国产精品久久亚洲不卡| 欧美日本不卡高清| 日韩精品视频在线看| 亚洲乱码视频| 在线精品一区| 日韩亚洲国产欧美| 蜜桃国内精品久久久久软件9| 国产粉嫩在线观看| 国产成年精品| 久久av免费看| 久久国内精品自在自线400部| 日韩 欧美一区二区三区| 免费在线观看一区二区三区| 樱桃成人精品视频在线播放| 不卡一区综合视频| 国产韩日影视精品| 一区在线免费观看| 亚洲激情五月| 99国产精品久久久久久久成人热| 亚洲午夜精品久久久久久app| 亚洲天堂黄色| 91九色精品| 亚洲一区区二区| 亚洲一区欧美| 欧美偷窥清纯综合图区| 日韩和欧美的一区| 天堂俺去俺来也www久久婷婷| 亚洲精品日韩久久| 国产日韩在线观看视频| 欧美激情视频一区二区三区免费| 久久三级中文| 婷婷激情一区| 国产精品亚洲人成在99www| 蜜桃av在线播放| 日本久久综合| 国产精品精品| 9999国产精品| 老牛影视精品| 欧美午夜精品一区二区三区电影| 久久免费大视频| 日韩精品免费一区二区在线观看| 久久久久久美女精品| 亚洲欧洲一区二区天堂久久| 久久性天堂网| 久久精品 人人爱| 国内在线观看一区二区三区 | 欧美va天堂| 午夜在线播放视频欧美| 日韩午夜视频在线| 欧美激情五月| 999视频精品| 在线看片一区| 国产精品日韩精品在线播放| 国产精品2023| 久久久久久婷| 欧美理论视频| 日韩高清电影一区| 国产白浆在线免费观看| 国产精品久久久久久久久免费高清| 国产美女高潮在线| 伊人久久成人| 国产乱码精品一区二区三区四区 | 欧美激情久久久久久久久久久| 亚洲欧洲高清| 制服诱惑一区二区| 久久精品99久久久| 国产成人a视频高清在线观看| 性欧美xxxx免费岛国不卡电影| 欧美一区=区| 国产欧美一区二区色老头| 日韩另类视频| 日韩欧美中文字幕一区二区三区| 鲁大师精品99久久久| 香蕉久久99| 国产免费播放一区二区| 欧美片第1页| 日韩国产成人精品| 秋霞影视一区二区三区| 亚洲精品人人| 欧美三级精品| 日韩欧美激情| 中文在线资源| 亚洲欧洲免费| 97精品一区| 亚洲人成精品久久久| 国产精品久久久久9999高清| 久久亚洲国产| 欧美一区自拍| 久久在线视频免费观看| 欧美日韩一区二区三区在线电影| 亚洲成av人片一区二区密柚| 日韩福利视频导航| 亚洲手机在线| 欧美aaaaaa午夜精品| 99国产一区| www.九色在线| 中文字幕一区二区av| 亚洲风情在线资源| 日韩成人午夜精品| 久久国产亚洲| 牛牛精品成人免费视频| 性色一区二区| 亚洲伦乱视频| 国产麻豆精品| 久久亚洲图片| 免费一二一二在线视频| 国产调教精品| 日韩中文字幕亚洲一区二区va在线| 国产一区日韩| 日本亚洲三级在线| japanese国产精品| 久久精品国产在热久久| 在线观看视频免费一区二区三区| 一本大道色婷婷在线| 国产精品最新自拍| 亚洲一区二区三区高清| 中文字幕色婷婷在线视频| 国产日韩一区| 中文一区一区三区免费在线观| 日韩一区二区三区免费播放| 国产精品xxx在线观看| 亚洲精品四区| 久久xxxx| 精品91久久久久| 亚洲国产专区校园欧美| 麻豆视频在线看|