先前有對大資料渲染進行調察研究,得知瞬間大資料的渲染,會造成瀏覽器卡頓不回應,並得出可以透過分時渲染、捲動式渲染、虛擬列表,解決高併發渲染的問題。
而籃足球比賽比分列表,一遇假日就會有1000~2000 筆的比賽需要同時顯示,且依使用者需求,不能分頁顯示。
設計概念,一開始先傳入高度,並將每一筆 item 的 邊界 getBoundingClientRect 結果快取起來,直到渲染出來會重新計算快取高度,透過容器的卷軸事件,css translate3d,操作 y 軸,達到到平移捲動的效果,只有利用實體捲軸的高度及捲動事件,但不是透過實體捲軸顯示,因此這就是為什麼稱之虛擬捲軸的原因。
跟虛擬捲軸最大的差異,分段捲軸一開始採用的用的真實的實體捲軸,除buffer item 其餘都僅渲染空 div 支撐捲軸高度,直到捲到 buffer item 時,才開始渲染該區間的元件。
拿 1000 筆左右的數據,資料採用分段渲染和一般炫染效能做比較,因為要渲染的筆數少了,其實可以預期效能差了快1x倍之多。
<VirtualScroller :list="news" class="news-list-wrapper" :item-default-height="100" :uni-key="'id'" :enable-scroll-up="!isLastPage" :auto-load-more="true" :enable-scroll-down="true" :buffer-size="4" @scrollDown="scrollDown" @scrollUp="scrollUp" > <template #default="slotScope"> <NewsCard :id="'news-' + slotScope.item[slotScope.uniKey]" :key="'news-' + slotScope.item[slotScope.uniKey]" :start="slotScope.start" :end="slotScope.end" :index="slotScope.index" :h="slotScope.height" :news="slotScope.item" :sport-id="slotScope.item.sportId" /> </template> </VirtualScroller>
<PartRenderingScroller :scroll-element-id="'schedule-container'" :list="early.early" :item-default-height="100" uni-key="matchId" class="schedule-list p-l-20 p-r-20" :buffer-size="50"> <template #default="slotScope"> <ScheduleCard :id="'live-' + slotScope.item[slotScope.uniKey]" :key="'live-' + slotScope.item[slotScope.uniKey]" :class="{'p-t-20':slotScope.index===0}" :start="slotScope.start" :end="slotScope.end" :index="slotScope.index" :h="slotScope.height" :sport-id="sportId" :schedule="slotScope.item" :lottery-type="lotteryType" /> </template> </PartRenderingScroller>
原始碼也不易理解及改動,最後決定自己刻了。
此時情境可能不適合用虛擬捲軸,而是要分段渲染卷軸。
元件初始化時,先給預設高,並快取起來,直到渲染出來,在去更新高度,postion 的快取。
聊天室最後將渲染索引反過來渲染,最先渲染使用者看得到的,直到使用者往上捲動。
改用 vuex 去記錄 hight light 的 match ,依據 vuex 去判透過 vue bind 判斷需不需要 hight light。
可以將分組資訊塞到該組第一個卡片上或是採用多個分段捲軸。
上述都是類似虛擬捲軸機制的套件,如果要整合捲軸類型的套件,最好還是自己擴充虛擬捲軸,不然要解決兩個虛擬捲軸機制在裡面衝突。
待整理