Vue3應(yīng)對后端接口返回十萬條數(shù)據(jù)的解決方案
引言
在前端開發(fā)中,我們有時會遇到后端接口直接返回 十萬條數(shù)據(jù) 的情況。很多初學(xué)者會直接把數(shù)據(jù)全部 v-for 渲染到頁面上,結(jié)果瀏覽器瞬間卡死甚至崩潰。
那么 Vue3 應(yīng)該如何優(yōu)雅地處理這種場景呢?本文將從問題原因出發(fā),逐步給出幾種常見解決方案,并附帶核心代碼示例。
一、為什么渲染十萬條會卡死?
瀏覽器的瓶頸并不是 JavaScript 運算,而是 DOM 渲染。
- 每條數(shù)據(jù)對應(yīng)一個 DOM 節(jié)點,十萬條就是十萬個節(jié)點。
- Vue3 雖然使用了 Virtual DOM 進行優(yōu)化,但最終還是要落到真實 DOM。
- DOM 過多會占用大量內(nèi)存和重繪開銷,頁面自然會卡。
所以,解決問題的核心就是:不要一次性渲染十萬條 DOM。
二、常見解決方案
1. 分頁加載(推薦)
后端接口分頁返回,例如:
- 每次返回 50 ~ 200 條數(shù)據(jù)。
- 前端通過分頁控件(Element Plus / Ant Design Vue)請求對應(yīng)頁碼的數(shù)據(jù)。
優(yōu)點:
- 最常見、最簡單,幾乎所有業(yè)務(wù)都適用。
- 避免前端卡頓和流量浪費。
示例:
<el-table :data="tableData"> <el-table-column prop="id" label="ID" /> <el-table-column prop="name" label="名稱" /> </el-table> <el-pagination v-model:current-page="page" :page-size="pageSize" :total="total" @current-change="fetchData" />
2. 虛擬列表(Virtual Scrolling)
如果必須一次性展示十萬條(例如日志查看、大數(shù)據(jù)報表),就需要用 虛擬滾動 技術(shù)。
核心思想:
- 頁面只渲染當(dāng)前視口可見的幾十條。
- 其余數(shù)據(jù)在滾動時動態(tài)計算位置并替換。
代碼示例(簡化版):
<template>
<div class="list" @scroll="onScroll" ref="container">
<div class="spacer" :style="{ height: totalHeight + 'px' }"></div>
<div
v-for="item in visibleData"
:key="item.id"
class="item"
:style="{ transform: `translateY(${item.offset}px)` }"
>
{{ item.text }}
</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
const data = ref(Array.from({ length: 100000 }, (_, i) => ({
id: i,
text: `Row ${i}`,
offset: 0
})))
const rowHeight = 30
const containerHeight = 600
const visibleCount = Math.ceil(containerHeight / rowHeight) + 2
const start = ref(0)
const totalHeight = data.value.length * rowHeight
const visibleData = computed(() => {
return data.value.slice(start.value, start.value + visibleCount).map((item, i) => ({
...item,
offset: (start.value + i) * rowHeight
}))
})
const onScroll = (e) => {
start.value = Math.floor(e.target.scrollTop / rowHeight)
}
</script>
<style>
.list { height: 600px; overflow-y: auto; position: relative; }
.spacer { width: 100%; }
.item { position: absolute; width: 100%; height: 30px; border-bottom: 1px solid #ddd; }
</style>
實際項目中,可以直接用成熟庫:
- vue-virtual-scroller
- Element Plus Table 虛擬滾動
3. 分片加載(Chunk / Streaming)
- 后端一次查出十萬條,但分批推送(如每 2000 條返回一次)。
- 前端邊收邊渲染,避免一次性阻塞。
實現(xiàn)方式:
- WebSocket / SSE 流式推送。
- 或者分頁接口 + 無限滾動組件。
4. Web Worker + 虛擬列表
如果數(shù)據(jù)量大且需要復(fù)雜計算(例如排序、聚合),建議把計算邏輯放到 Web Worker,避免阻塞主線程。前端渲染依然用虛擬列表。
三、總結(jié)
- 能改接口 ? 優(yōu)先分頁,最簡單、最高效。
- 必須一次性拿十萬條 ? 虛擬列表是標(biāo)配。
- 有計算需求 ? Web Worker + 虛擬列表。
記住,前端性能優(yōu)化的核心就是 減少真實 DOM 數(shù)量。
以上就是Vue3應(yīng)對后端接口返回十萬條數(shù)據(jù)的解決方案的詳細內(nèi)容,更多關(guān)于Vue3后端接口返回十萬條數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue注冊模塊與登錄狀態(tài)的持久化實現(xiàn)方法詳解
這篇文章主要介紹了Vue注冊模塊與登錄狀態(tài)的持久化實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
Vue Element前端應(yīng)用開發(fā)之echarts圖表
在我們做應(yīng)用系統(tǒng)的時候,往往都會涉及圖表的展示,綜合的圖表展示能夠給客戶帶來視覺的享受和數(shù)據(jù)直觀體驗,同時也是增強客戶認同感的舉措之一2021-05-05
vue3中如何使用Pinia實現(xiàn)數(shù)據(jù)持久化操作
使用vue3中的pinia,我們可以在多個頁面間共享數(shù)據(jù),但是一旦我們關(guān)閉或刷新頁面,這些數(shù)據(jù)就會丟失,因此,我們需要有一種數(shù)據(jù)持久化的解決方案,下面我們就來看看具體如何解決的吧2023-10-10
element使用自定義icon圖標(biāo)的兩種解決方式
因為安裝原型圖設(shè)計實現(xiàn)頁面,在element自帶的圖標(biāo)庫好像沒有,所以按鈕的圖標(biāo)icon需要自定義,下面這篇文章主要給大家介紹了關(guān)于element使用自定義icon圖標(biāo)的兩種解決方式,需要的朋友可以參考下2022-07-07
Vue 清除Form表單校驗信息的解決方法(清除表單驗證上次提示信息)
這篇文章主要介紹了Vue 清除Form表單校驗信息的解決方法(清除表單驗證上次提示信息),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04
vue+vuex+axios從后臺獲取數(shù)據(jù)存入vuex,組件之間共享數(shù)據(jù)操作
這篇文章主要介紹了vue+vuex+axios從后臺獲取數(shù)據(jù)存入vuex,組件之間共享數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07

