精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

5 萬條數(shù)據(jù)不卡!虛擬列表終極方案來了!

云計算 虛擬化
大多數(shù)同學針對虛擬列表時,都會說:服務端一口氣給我們返回 幾萬條數(shù)據(jù),我們通過虛擬列表的方式進行渲染。

說到虛擬列表應該沒有同學不知道吧,這是目前很多同學面試的時候經(jīng)常會作為項目難點來描述的內(nèi)容。

大多數(shù)同學針對虛擬列表時,都會說:服務端一口氣給我們返回 幾萬條數(shù)據(jù),我們通過虛擬列表的方式進行渲染。

然后,面試官通常都會通過一句話堵死你:為啥服務端一定要返回幾萬條數(shù)據(jù)呢?

額。。。尷尬啊。。。

所以,咱們今天這篇文章,就主要解決 面試聊到虛擬列表 的兩個核心問題:

  1. 虛擬列表的 真實體現(xiàn)場景 是什么?
  2. 虛擬列表的 終極解決方案 是什么?

真實體現(xiàn)場景

面試官問的沒錯:正常情況下,服務端沒必要一次性返回 5 萬條數(shù)據(jù)

那為什么我們還需要虛擬列表呢?

其實,在實際業(yè)務中,虛擬列表的需求非常普遍,遠遠不止“服務端一次性返回幾萬條”。

下面給大家拆幾個真實落地的場景:

1. 后臺系統(tǒng):訂單、日志管理

做后臺開發(fā)的同學一定熟悉:訂單列表、操作日志、用戶流水,動輒幾十萬條。

雖然前端一般會分頁,但有時候業(yè)務場景要求:

  • 支持無限滾動加載(例如用戶下拉快速翻查訂單)。
  • 支持快速定位(跳轉(zhuǎn)到第 N 頁、第 N 條)。

這種場景下,即便分批請求,只要用戶不斷的上啦加載更多的數(shù)據(jù),前端依然要承載數(shù)萬條數(shù)據(jù)的渲染

2. 電商、內(nèi)容流:無限加載

在 App 或 H5 頁面,商品流、視頻流、評論區(qū)等業(yè)務場景普遍采用“無限滾動”的交互。

既:用戶可以一直往下滑,直到加載幾千、甚至上萬條數(shù)據(jù)。

那么在這種情況下,如果你直接用 v-for 渲染所有數(shù)據(jù),內(nèi)存和 DOM 數(shù)量很快就爆掉。

所以,此時就必須要使用 虛擬列表 了

3. 數(shù)據(jù)大屏:實時推送

很多公司都會做數(shù)據(jù)可視化大屏,這種項目又一個特點,那就是: 實時展示告警流、消息流、交易流水,并且數(shù)據(jù)量是實時刷新的、不斷累積的

同時,需求通常要求“全量展示”,不能只保留最新幾條。

這種情況下,傳統(tǒng)渲染很快就頂不住了,只有 虛擬列表才能保證大屏不卡頓

4. 聊天、IM:動態(tài)高度 & 無限消息

聊天窗口也是典型場景之一。

通常情況下,聊天記錄會隨著用戶滾動不斷加載歷史消息,每條消息高度還可能不一致(文本、圖片、語音混合)。

那么在這樣的條件下,我們又必須要保證加載上萬條消息依然流暢,還要支持“滾動到底部”邏輯。

這類場景更復雜,需要虛擬列表的動態(tài)高度方案

終極解決方案

上面聊了真實場景,那么問題來了:虛擬列表到底是怎么解決幾萬條數(shù)據(jù)不卡頓的?

一句話總結(jié):

虛擬列表的核心就是:只渲染用戶能看到的部分,其他內(nèi)容用“假的”代替。

三大核心要素

要讓虛擬列表真正跑起來,必須搞定這三個關(guān)鍵點:

  1. 可視區(qū)渲染:頁面上顯示多少內(nèi)容,就只渲染這些內(nèi)容。比如屏幕高度能容納 10 條數(shù)據(jù),那就只創(chuàng)建 10 條 DOM,而不是 50000 條。
  2. 緩沖區(qū):滾動時如果只渲染剛好可見的內(nèi)容,可能會出現(xiàn)“滾動過快導致白屏”。解決辦法是:在上下區(qū)域額外渲染一些數(shù)據(jù)(比如上下各多渲染 5 條),即所謂“緩沖區(qū)”。
  3. 占位高度(位置計算):用戶看到的只是局部,但滾動條必須是全量的。

通常做法:用一個虛擬的容器高度(總數(shù)據(jù)條數(shù) × 每條高度)來撐起滾動條。然后通過 transform: translateY(...) 或 margin-top 來調(diào)整渲染元素的位置,看起來就像“在滾動”。

工作流程拆解

  1. 用戶滾動時,計算當前的 scrollTop
  2. 根據(jù) scrollTop 推算出 起始索引(startIndex) 和 結(jié)束索引(endIndex)
  3. 截取 listData[startIndex ~ endIndex] 作為 渲染區(qū)數(shù)據(jù)
  4. 用一個大容器元素模擬總高度,再通過 translateY(offsetY) 把可見內(nèi)容放到正確的位置。

這樣,不管列表有 5 千條還是 5 萬條,瀏覽器永遠只需要渲染幾十個 DOM 節(jié)點,性能從根本上被優(yōu)化

實例代碼

最后咱們就以 Vue 為例,來看下如何實現(xiàn)這個虛擬列表方案

VirtualList.vue

<script setup>
import { ref, computed, onMounted, nextTick, watch, defineExpose } from 'vue'

const props = defineProps({
 items: { type: Array, required: true }, // 全量數(shù)據(jù)
 height: { type: Number, required: true }, // 容器高度
 itemHeight: { type: Number, required: true }, // 每行固定高度
 buffer: { type: Number, default: 6 }, // 緩沖條數(shù)
 keyField: { type: String, default: 'id' } // 唯一 key
})

const emit = defineEmits(['rangeChange', 'reachEnd'])

const containerRef = ref(null)
const scrollTop = ref(0)

const visibleCount = computed(() => Math.ceil(props.height / props.itemHeight))
const totalHeight = computed(() => props.items.length * props.itemHeight)

const startIndex = computed(() =>
 Math.max(0, Math.floor(scrollTop.value / props.itemHeight) - props.buffer)
)
const endIndex = computed(() =>
 Math.min(
  props.items.length,
  startIndex.value + visibleCount.value + props.buffer * 2
 )
)

const offsetY = computed(() => startIndex.value * props.itemHeight)
const visibleItems = computed(() =>
 props.items.slice(startIndex.value, endIndex.value)
)

function onScroll() {
 const el = containerRef.value
 if (!el) return
 scrollTop.value = el.scrollTop
 emit('rangeChange', { start: startIndex.value, end: endIndex.value })
 if (endIndex.value >= props.items.length - props.buffer * 2) emit('reachEnd')
}

function scrollToIndex(index, align = 'start') {
 const el = containerRef.value
 if (!el) return
 const clamped = Math.max(0, Math.min(index, props.items.length - 1))
 let top = clamped * props.itemHeight
 if (align === 'center') top -= (props.height - props.itemHeight) / 2
 else if (align === 'end') top -= props.height - props.itemHeight
 el.scrollTop = Math.max(0, top)
 onScroll()
}

function reset() {
 const el = containerRef.value
 if (!el) return
 el.scrollTop = 0
 onScroll()
}

onMounted(() => nextTick(onScroll))
watch(
 () => props.items.length,
 async () => {
  await nextTick()
  onScroll()
 }
)

defineExpose({ scrollToIndex, reset })
</script>

<template>
 <div
  ref="containerRef"
  class="vl-container"
  :style="{ height: height + 'px' }"
  @scroll="onScroll"
 >
  <!-- 占位高度:撐滾動條 -->
  <div :style="{ height: totalHeight + 'px' }" aria-hidden="true"></div>

  <!-- 可視區(qū):絕對定位 + translateY -->
  <div class="vl-list" :style="{ transform: `translateY(${offsetY}px)` }">
   <div
    v-for="(row, i) in visibleItems"
    :key="row?.[keyField] ?? startIndex + i"
    class="vl-item"
    :style="{ height: itemHeight + 'px', lineHeight: itemHeight + 'px' }"
   >
    <slot name="row" :row="row" :index="startIndex + i"></slot>
   </div>
  </div>
 </div>
</template>

<style>
.vl-container {
 /* 父容器必須相對定位 + 可滾動 */
 position: relative;
 overflow-y: auto;
 border: 1px solid #e5e7eb;
 background: #fff;
}

/* 關(guān)鍵:絕對定位到頂部 + 蓋住占位層 */
.vl-list {
 position: absolute;
 top: 0;
 left: 0;
 right: 0;
 width: 100%;
 z-index: 1;
 will-change: transform;
}

.vl-item {
 padding: 0 12px;
 border-bottom: 1px solid #f1f5f9;
 font-size: 14px;
 white-space: nowrap;
 text-overflow: ellipsis;
 overflow: hidden;
}
</style>

App.vue

<script setup>
import { ref } from 'vue'
import VirtualList from './VirtualList.vue'

const items = ref(
 Array.from({ length: 50000 }, (_, i) => ({
  id: i,
  name: `訂單 #${i}`,
  amount: (Math.random() * 1000).toFixed(2)
 }))
)

function onRangeChange(r) {
 console.log('可見區(qū)范圍:', r)
}

function onReachEnd() {
 console.log('觸底了,加載更多數(shù)據(jù)...')
 setTimeout(() => {
  const base = items.value.length
  items.value.push(
   ...Array.from({ length: 1000 }, (_, i) => ({
    id: base + i,
    name: `訂單 #${base + i}`,
    amount: (Math.random() * 1000).toFixed(2)
   }))
  )
 }, 500)
}
</script>

<template>
 <VirtualList
  :items="items"
  :height="560"
  :item-height="44"
  :buffer="8"
  key-field="id"
  @rangeChange="onRangeChange"
  @reachEnd="onReachEnd"
 >
  <template #row="{ row, index }">
   <span style="margin-right: 8px">{{ index }}</span>
   {{ row.name }} -- ¥{{ row.amount }}
  </template>
 </VirtualList>
</template>

最終渲染效果

圖片圖片

責任編輯:武曉燕 來源: 程序員Sunday
相關(guān)推薦

2019-07-16 08:51:03

熱搜新浪微博數(shù)據(jù)

2021-11-02 14:46:50

數(shù)據(jù)

2023-10-19 15:13:25

2011-03-31 11:24:14

數(shù)據(jù)搜索本文字段

2019-11-28 18:54:50

數(shù)據(jù)庫黑客軟件

2018-08-27 07:01:33

數(shù)據(jù)分析數(shù)據(jù)可視化租房

2022-04-28 20:12:44

二分法搜索算法

2022-06-17 10:15:35

面試API前端

2017-07-22 22:11:36

數(shù)據(jù)丟失操作

2018-09-13 09:39:03

騰訊運維IT

2015-10-08 08:51:40

PHP內(nèi)存耗盡解決方案

2024-05-11 12:34:51

EasyExcelOOM代碼

2024-03-07 08:08:51

SQL優(yōu)化數(shù)據(jù)

2024-04-09 07:56:36

MySQL數(shù)據(jù)性能

2019-10-18 15:36:24

網(wǎng)易歌單熱評

2014-01-21 17:36:58

2025-03-07 11:17:09

2013-05-16 10:15:11

信息泄密彭博Bloomberg

2022-10-27 21:32:28

數(shù)據(jù)互聯(lián)網(wǎng)數(shù)據(jù)中心

2022-04-12 16:39:55

數(shù)據(jù)泄露網(wǎng)絡攻擊
點贊
收藏

51CTO技術(shù)棧公眾號

99精品电影| 午夜视频网站在线观看| 日本不卡免费高清视频在线| 久久这里只有精品视频网| 精品久久久久久久久国产字幕 | 久久久9色精品国产一区二区三区| 91精品欧美福利在线观看| 久久久久久国产精品免费免费| 91久久精品美女高潮| 久久久久亚洲AV成人无在| 亚洲综合资源| 精品露脸国产偷人在视频| 亚洲国产欧美日韩| 一级aaa毛片| 中国av一区| 欧美一区二区成人| 日韩a在线播放| 免费av网站在线观看| 99视频精品免费视频| 国产一区二区在线播放| 永久免费看片在线播放| 成人福利一区| 欧美日韩激情在线| 久久久免费视频网站| 午夜伦理大片视频在线观看| 欧美国产日韩a欧美在线观看| 99re在线观看| 国产精品视频一二区| 亚洲综合不卡| 久久全国免费视频| 国精产品一区一区二区三区mba | 亚洲国产精久久久久久久| 欧美男女交配视频| 亚洲深夜视频| 午夜婷婷国产麻豆精品| 经典三级在线视频| 成人全视频高清免费观看| 99久久99久久精品免费观看| 国内精品小视频在线观看| 日本少妇aaa| 精品日韩一区| 亚洲视频在线观看免费| 三级黄色片网站| 国产精品22p| 欧美日韩一区二区免费在线观看| 国产91视频一区| 超碰免费在线97| 理论电影国产精品| 国产精品国语对白| 亚洲 欧美 中文字幕| 欧美少妇xxxx| 亚洲天堂网在线观看| 国产亚洲无码精品| 小说区图片区色综合区| 日韩av在线最新| 真人bbbbbbbbb毛片| 欧美黑白配在线| 欧美在线三级电影| 免费看污污视频| 久草资源在线观看| 成人v精品蜜桃久久一区| 国产97免费视| 毛片在线免费播放| 日韩精品电影在线| 日韩av123| 天码人妻一区二区三区在线看| 国产精品美女| 国产精品爱啪在线线免费观看| 日本久久综合网| 日本中文字幕一区二区视频| 国产精品视频网| 一本一道精品欧美中文字幕| 激情六月婷婷久久| 不卡的av一区| 视频国产在线观看| 国产日本亚洲高清| 中文字幕乱码一区二区三区| 在线观看免费视频你懂的| 亚洲国产日韩a在线播放性色| www在线观看免费| 国产丝袜在线| 亚洲一区视频在线| 性刺激综合网| 人妻丰满熟妇av无码区hd| 97国产一区二区| 午夜精品亚洲一区二区三区嫩草| 大片免费在线观看| 天天综合天天做天天综合| caopor在线视频| 高清精品在线| 欧美三级日韩在线| 国产无套精品一区二区三区| 欧美中文一区| 精品国产一区二区在线| 国产一级生活片| 日本91福利区| 国产激情一区二区三区在线观看 | 黄色一级片国产| 免费成人在线电影| 欧美日韩精品欧美日韩精品一| 精品人妻无码中文字幕18禁| 日韩精品免费一区二区三区竹菊 | 日本欧美一区二区| 91福利视频导航| 在线免费看av| 精品欧美aⅴ在线网站| 三上悠亚在线一区| 爽爽窝窝午夜精品一区二区| 久久国产加勒比精品无码| www.毛片.com| 国产99久久久久| 天天综合色天天综合色hd| 日韩电影免费观看| 欧美系列日韩一区| 日本免费福利视频| 欧美成人首页| 国产日韩在线亚洲字幕中文| 欧美偷拍视频| aaa国产一区| 亚洲欧美一二三| 91精品韩国| 亚洲黄色片网站| 欧美黄片一区二区三区| 久久精品国产亚洲高清剧情介绍| 免费在线观看91| xxxx在线视频| 欧美一二三四区在线| 在线观看亚洲大片短视频| 国产精品三上| 国产伦精品一区二区三区高清版 | 久久精品久久久| 国产精品日韩欧美| 国产精品二线| 日韩欧美高清视频| 人妻无码中文久久久久专区| 韩国av一区| 97精品视频在线| 不卡的日韩av| 亚洲综合精品久久| 四川一级毛毛片| 香蕉综合视频| 成人黄色生活片| 麻豆影视在线观看_| 欧美日韩一区二区三区在线 | 国产高清在线不卡| 亚洲图片中文字幕| 亚洲国产岛国毛片在线| 亚洲人成无码www久久久| 久久99高清| 国产精品白嫩美女在线观看 | 国产亚洲欧美在线| 国产l精品国产亚洲区久久| 小说区图片区色综合区| 日本午夜精品理论片a级appf发布| 欧洲天堂在线观看| 欧美在线一二三| 午夜激情福利电影| 激情综合网最新| 中文字幕乱码免费| 91精品入口| 91精品国产高清| 污污网站免费在线观看| 日韩欧美国产成人| 蜜桃无码一区二区三区| 奇米色777欧美一区二区| 亚洲视频精品一区| 国产午夜精品一区在线观看| 色综合久久精品亚洲国产| 人妻无码中文字幕免费视频蜜桃| 午夜精品久久久久久久蜜桃app| 国产又黄又粗又猛又爽的视频| 久久久久久久欧美精品| 亚洲国产高清国产精品| 精品一区二区三区中文字幕在线| 亚洲国产欧美一区二区三区同亚洲| 久久精品国产亚洲av无码娇色 | 亚洲av熟女国产一区二区性色| 蜜臀av亚洲一区中文字幕| 国产三级中文字幕| 久久人人爽人人爽人人片av不| 日本高清视频精品| 黄色小网站在线观看| 亚洲成人精品视频| 中文在线资源天堂| 97久久精品人人做人人爽50路| 欧美一级黄色片视频| 色综合狠狠操| 精品视频第一区| 欧美成人毛片| 97久久久免费福利网址| 91社区在线| 亚洲精品电影网| 亚洲字幕av一区二区三区四区| 亚洲在线观看免费视频| 偷拍夫妻性生活| 中文精品在线| 亚洲精品久久久久久一区二区| 久久99精品久久久野外观看| 青草青草久热精品视频在线观看| 久久久久久久久免费视频| 日韩电影中文 亚洲精品乱码| 一级特黄aa大片| 欧美日韩精品在线播放| 中文字幕观看av| www精品美女久久久tv| 中文字幕55页| 免费人成精品欧美精品| 久久国产精品视频在线观看| 国产精久久久久久| 久久爱www.| 97人人模人人爽人人喊中文字| av在线第一页| 亚洲精品国产精品自产a区红杏吧| 中文字幕日本人妻久久久免费 | 国产日产欧美a一级在线| 青草在线视频| 久久精品夜夜夜夜夜久久| 蜜桃免费在线| 亚洲国产成人久久综合| 国产又黄又爽视频| 欧美性大战久久久久久久| 欧美福利视频一区二区| 一区二区高清免费观看影视大全| 欧美一区二区三区观看| 久久九九久久九九| www.超碰97| 成人av免费观看| 色诱av手机版| 国产精品一区二区不卡| 欧美日韩精品免费观看| 在线免费看h| 久久久久久久久久久免费| 成人福利片网站| 精品国产一区二区三区久久久狼 | 国产女人18毛片水真多成人如厕 | 国产日韩亚洲欧美综合| 大尺度做爰床戏呻吟舒畅| 国产91精品久久久久久久网曝门 | 中文字幕精品在线观看| 一本色道久久综合狠狠躁的推荐| 91精品国产乱码在线观看| 艳妇臀荡乳欲伦亚洲一区| 久久中文免费视频| 亚洲另类在线视频| 日本天堂中文字幕| 亚洲综合精品久久| www.youjizz.com亚洲| 亚洲国产毛片aaaaa无费看 | 精品人妻一区二区三区视频| 99久久综合精品| 7788色淫网站小说| 99国产麻豆精品| 成人免费看aa片| 国产亚洲一二三区| 亚洲精品天堂网| 中文字幕中文乱码欧美一区二区| 91大神福利视频| 亚洲欧美日韩一区二区三区在线观看| 欧美日韩午夜视频| 亚洲综合偷拍欧美一区色| 精品无码久久久久久久久| 暴力调教一区二区三区| 亚洲成av人片在线观看无| 99国内精品久久| 亚洲图片另类小说| 亚洲国产精品二十页| 男人的午夜天堂| 亚洲综合一区二区精品导航| 日韩久久精品视频| 91黄色免费观看| 亚洲天堂中文字幕在线| 日韩免费成人网| 五月婷婷久久久| 一区三区二区视频| 99在线播放| 91av福利视频| 激情亚洲小说| 国产伦精品一区二区三区照片91 | 久久久久综合网| 制服丨自拍丨欧美丨动漫丨| 亚洲精品视频免费看| 91精品国产乱码在线观看| 欧美日韩一区不卡| 亚洲AV无码精品自拍| 欧美亚洲精品一区| 国产黄色片网站| 亚洲乱码av中文一区二区| 一区二区三区视频在线观看视频| 久操成人在线视频| 欧美暴力调教| 高清国语自产拍免费一区二区三区| 午夜精品福利影院| 热这里只有精品| 久久中文在线| 中文字幕永久免费| 欧美极品少妇xxxxⅹ高跟鞋| 欧美日韩激情在线观看| 日本韩国一区二区三区| 丰满人妻妇伦又伦精品国产| 国产一区二区三区免费视频| 男女在线视频| 成人黄色片网站| 综合干狼人综合首页| 免费观看亚洲视频| 琪琪一区二区三区| www.免费av| 一区二区国产视频| 一级黄色片在线| 精品亚洲国产视频| 欧美性受ⅹ╳╳╳黑人a性爽| 国产精品久久久久久久久| 久久av国产紧身裤| 99久久久精品视频| 久久精品国产99| 在线观看国产精品一区| 亚洲成va人在线观看| 99免费在线视频| 色偷偷av一区二区三区乱| 日韩激情电影免费看| 成人三级在线| 欧美大片一区| 伊人免费视频二| 国产精品久久久久影视| 黄色网址中文字幕| 精品无人区乱码1区2区3区在线| 国产盗摄在线视频网站| 亚洲最大av在线| 日韩中文首页| 超碰在线97免费| 国产区在线观看成人精品 | 免费看成人av| 中文久久精品| 黄色a一级视频| 欧美午夜女人视频在线| 天堂在线观看视频| 97精品视频在线播放| 极品国产人妖chinesets亚洲人妖 激情亚洲另类图片区小说区 | 久久出品必属精品| 国产精品久久看| 一级特黄aaa大片在线观看| 日韩综合视频在线观看| 欧美日韩亚洲国产| 涩涩涩999| 麻豆精品久久久| 二区三区四区视频| 欧美精品一二三四| 亚洲国产av一区二区| 欧美成人精品一区二区| 国产一区二区三区黄网站| 成人在线观看www| 国产福利91精品一区二区三区| 青青操视频在线播放| 欧美电影精品一区二区| 尤物视频在线看| 国产精品xxx在线观看www| 亚洲经典三级| 国产全是老熟女太爽了| 欧美日韩综合在线| 毛片av在线| 俄罗斯精品一区二区| aⅴ色国产欧美| 五月天综合视频| 欧美日韩一区二区电影| 99视频免费在线观看| 国产乱码精品一区二区三区日韩精品 | 中文字幕一区二区在线播放| 国产又黄又大又爽| 久久久亚洲网站| 一区二区美女| 国产精品一区二区小说| 亚洲精品自拍动漫在线| 内射后入在线观看一区| 日本精品免费一区二区三区| 欧美呦呦网站| 麻豆网站免费观看| 欧美日韩国产一区中文午夜| 国产日产精品久久久久久婷婷| 91精品在线一区| 日韩一级欧洲| 国产又色又爽又高潮免费| 欧美videofree性高清杂交| 周于希免费高清在线观看| 亚洲成人av动漫| 国产ts人妖一区二区| 中文字字幕在线中文| 色综久久综合桃花网| 国产精品自在线拍| 精品久久久久久久无码 | 91精品视频免费| 亚洲国产高清一区二区三区| 亚洲av片不卡无码久久| 一区二区三区四区在线免费观看 | 久久最新资源网| 在线精品自拍| 日韩专区欧美专区| 日韩在线一区视频| 亚洲mv大片欧洲mv大片精品| 国产九九在线| 成人资源视频网站免费| 日本伊人色综合网|