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

您的位置:首頁技術(shù)文章
文章詳情頁

如何讓vue長列表快速加載

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

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

背景

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

vue-long-list-load

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

主要內(nèi)容 vue-long-list-load 與 vue-virtual-scroll-list 對比 vue-long-list-load實現(xiàn)思路 基本代碼 插件使用方式 插件參數(shù)說明 一、組件對比

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

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

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

如何讓vue長列表快速加載

三、關(guān)鍵方法源碼分析

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

<!--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>

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

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

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

<!--每個節(jié)點尺寸發(fā)生變化--> 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]) } }) });

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

getShowLimit(startTop) { const scrollTop = startTop || this.scrollWrap[this.directionConfig.scrollTo] || 0; // 滾動距離 this.viewClientHeight = this.scrollWrap[this.directionConfig.width]; // 可視區(qū)域高度 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); },

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

// 根據(jù)高度計算節(jié)點是否顯示 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.題目頂部在顯示范圍內(nèi) 2.題目底部在顯示范圍內(nèi) 3.題目頂部和底部都不在顯示范圍內(nèi) 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

項目內(nèi)調(diào)用

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

部分參數(shù)說明

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

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

以上就是如何讓vue長列表快速加載的詳細(xì)內(nèi)容,更多關(guān)于vue 長列表快速加載的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Vue
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美亚洲综合视频| 天堂精品久久久久| 久久这里只有| 久久在线91| 精品国产成人| 国产资源在线观看入口av| 日韩大片在线观看| 日韩精品一区二区三区免费观影| 狂野欧美性猛交xxxx| 成人在线超碰| 午夜av成人| 亚洲国产一区二区三区在线播放| 五月天久久久| 三级欧美韩日大片在线看| 亚欧洲精品视频在线观看| 日本不卡在线视频| 欧美激情综合| 成人日韩在线| 亚洲深夜影院| 日韩福利视频一区| 久久久久伊人| 久久一区二区三区电影| 爽爽淫人综合网网站| 亚洲综合福利| 久久不卡日韩美女| 丝袜av一区| 中文视频一区| 精品中文字幕一区二区三区| 亚洲精品国产嫩草在线观看 | 午夜欧美精品| 中文字幕成人| 久久国产精品美女| 日本免费一区二区三区四区| 99亚洲视频| 日韩在线视频一区二区三区| 国产精品久久| 久久激情一区| 亚洲精品三级| jizzjizz中国精品麻豆| 玖玖玖国产精品| 国产精品大片| 亚洲国产一区二区三区在线播放| 亚洲+小说+欧美+激情+另类| 国产美女久久| 久久精品国产www456c0m| 少妇精品久久久| 最新中文字幕在线播放| 久久国产精品毛片| 久久精品系列| 在线综合视频| 国产福利资源一区| 黑丝一区二区三区| 国产精品久久久久久久久久妞妞| 国产99久久久国产精品成人免费| 日韩激情视频网站| 99久久九九| 国产精品宾馆| 99国产一区| 国产精品久久久久久久免费观看 | 国产精品亚洲一区二区在线观看| 日本精品影院| 国产欧美亚洲精品a| 免费久久久久久久久| 国产精品成人国产| 老鸭窝毛片一区二区三区| 色爱综合网欧美| 日韩免费精品| 欧美日韩黑人| 精品成av人一区二区三区| 视频一区在线播放| 中文字幕在线视频网站| 青草国产精品| 国产亚洲网站| 日韩av在线播放网址| 日本aⅴ精品一区二区三区| 91九色精品| 亚洲精品永久免费视频| 97久久超碰| 99国产精品99久久久久久粉嫩| 精品九九在线| 91大神在线观看线路一区| 好看的亚洲午夜视频在线| 福利一区二区| 国产精品一区二区三区美女| 免费黄网站欧美| 国产一区视频在线观看免费| 福利一区二区三区视频在线观看| 91综合久久爱com| 亚洲视频www| 久久人人精品| 国产成人免费av一区二区午夜| 日本一区免费网站| 午夜欧美视频| 影视先锋久久| 日韩精品诱惑一区?区三区| 里番精品3d一二三区| 91九色综合| 亚洲精品动态| 视频一区在线播放| 亚洲欧洲一区二区天堂久久| 三上悠亚国产精品一区二区三区| 欧美国产三级| 久久国产三级精品| 日韩1区2区3区| 亚洲精品极品| 亚洲午夜久久| 日韩中文字幕1| 午夜一级在线看亚洲| 合欧美一区二区三区| 1024精品一区二区三区| 99成人超碰| 欧美午夜精彩| 不卡中文一二三区| 狠狠色狠狠色综合日日tαg| 午夜欧美在线| 欧美日韩一二| 欧美精品羞羞答答| 亚洲激情av| 狠狠久久婷婷| 尤物网精品视频| 尤物精品在线| 麻豆精品网站| 日韩中文字幕亚洲一区二区va在线| 亚洲永久字幕| 久久福利毛片| 亚洲精品一区二区在线播放∴| 亚洲精品美女| 国产日韩三级| 久久69成人| 天堂中文在线播放| 1000部精品久久久久久久久| 亚洲欧洲另类| 亚洲精品系列| 亚洲精品国产精品粉嫩| 日韩福利视频一区| 国产精品久一| 精品久久视频| 日韩欧美中文| 不卡在线一区二区| 中文不卡在线| 国产日韩一区二区三区在线| 久久伊人久久| 日韩精品水蜜桃| 亚洲免费网址| 91亚洲精品视频在线观看 | 亚洲最新av| 国产伦理一区| 久久一区精品| 亚洲日本网址| 在线亚洲一区| 欧美精品影院| 日韩成人免费| 最新国产拍偷乱拍精品| 日韩精品久久久久久| 九九99久久精品在免费线bt| 蜜桃视频在线网站| 亚洲一区日韩在线| 国产乱论精品| 亚洲成人二区| 日韩精品成人在线观看| 精品国产亚洲一区二区三区| 91精品一区国产高清在线gif| 亚洲一区二区三区免费在线观看 | 国产精品97| 欧美在线看片| 久久电影tv| 美女精品网站| 麻豆国产欧美一区二区三区 | 欧美精品福利| 日韩在线短视频| 爽爽淫人综合网网站| 国产精品成人3p一区二区三区| 欧洲一级精品| 中文一区一区三区免费在线观 | 丝袜国产日韩另类美女| 国产精品mv在线观看| 99久久久久| 日韩激情视频网站| 日韩欧美在线中字| 日韩一区二区三区在线看| 91日韩免费| 综合国产精品| 日韩精品诱惑一区?区三区| 亚洲免费成人av在线| av在线资源| 免费在线观看精品| 成人国产精选| 日韩精品免费视频人成| 啪啪国产精品| 国产精品日本一区二区三区在线 | 国产欧美日韩亚洲一区二区三区| 免费污视频在线一区| 国产香蕉精品| 国产亚洲在线| av免费不卡国产观看| 少妇精品久久久| 久久亚洲成人| 国产福利资源一区| 免费视频最近日韩| 久久国产电影|