Vue3应对后端接口返回十万条数据的解决方案

 更新时间:2025年09月17日 09:16:57   作者:编程随想_Code  
在前端开发中,我们有时会遇到后端接口直接返回 十万条数据 的情况,很多初学者会直接把数据全部 v-for 渲染到页面上,结果浏览器瞬间卡死甚至崩溃,本文将从问题原因出发,逐步给出几种常见解决方案,需要的朋友可以参考下

引言

在前端开发中,我们有时会遇到后端接口直接返回 十万条数据 的情况。很多初学者会直接把数据全部 v-for 渲染到页面上,结果浏览器瞬间卡死甚至崩溃。

那么 Vue3 应该如何优雅地处理这种场景呢?本文将从问题原因出发,逐步给出几种常见解决方案,并附带核心代码示例。

一、为什么渲染十万条会卡死?

浏览器的瓶颈并不是 JavaScript 运算,而是 DOM 渲染

  • 每条数据对应一个 DOM 节点,十万条就是十万个节点。
  • Vue3 虽然使用了 Virtual DOM 进行优化,但最终还是要落到真实 DOM。
  • DOM 过多会占用大量内存和重绘开销,页面自然会卡。

所以,解决问题的核心就是:不要一次性渲染十万条 DOM

二、常见解决方案

1. 分页加载(推荐)

后端接口分页返回,例如:

  • 每次返回 50 ~ 200 条数据。
  • 前端通过分页控件(Element Plus / Ant Design Vue)请求对应页码的数据。

优点:

  • 最常见、最简单,几乎所有业务都适用。
  • 避免前端卡顿和流量浪费。

示例:

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

如果必须一次性展示十万条(例如日志查看、大数据报表),就需要用 虚拟滚动 技术。

核心思想:

  • 页面只渲染当前视口可见的几十条。
  • 其余数据在滚动时动态计算位置并替换。

代码示例(简化版):

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

实际项目中,可以直接用成熟库:

3. 分片加载(Chunk / Streaming)

  • 后端一次查出十万条,但分批推送(如每 2000 条返回一次)。
  • 前端边收边渲染,避免一次性阻塞。

实现方式:

  • WebSocket / SSE 流式推送。
  • 或者分页接口 + 无限滚动组件。

4. Web Worker + 虚拟列表

如果数据量大且需要复杂计算(例如排序、聚合),建议把计算逻辑放到 Web Worker,避免阻塞主线程。前端渲染依然用虚拟列表。

三、总结

  • 能改接口 ➝ 优先分页,最简单、最高效。
  • 必须一次性拿十万条 ➝ 虚拟列表是标配。
  • 有计算需求 ➝ Web Worker + 虚拟列表。

记住,前端性能优化的核心就是 减少真实 DOM 数量

以上就是Vue3应对后端接口返回十万条数据的解决方案的详细内容,更多关于Vue3后端接口返回十万条数据的资料请关注脚本之家其它相关文章!

相关文章

  • Vue3播放m3u8视频的两种实现方式示例

    Vue3播放m3u8视频的两种实现方式示例

    这篇文章主要介绍了Vue3播放m3u8视频的两种实现方式,两种视频播放器组件分别是vue3-video-play和chimee-player,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • Vue注册模块与登录状态的持久化实现方法详解

    Vue注册模块与登录状态的持久化实现方法详解

    这篇文章主要介绍了Vue注册模块与登录状态的持久化实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Vue Element前端应用开发之echarts图表

    Vue Element前端应用开发之echarts图表

    在我们做应用系统的时候,往往都会涉及图表的展示,综合的图表展示能够给客户带来视觉的享受和数据直观体验,同时也是增强客户认同感的举措之一
    2021-05-05
  • vue3中如何使用Pinia实现数据持久化操作

    vue3中如何使用Pinia实现数据持久化操作

    使用vue3中的pinia,我们可以在多个页面间共享数据,但是一旦我们关闭或刷新页面,这些数据就会丢失,因此,我们需要有一种数据持久化的解决方案,下面我们就来看看具体如何解决的吧
    2023-10-10
  • element使用自定义icon图标的两种解决方式

    element使用自定义icon图标的两种解决方式

    因为安装原型图设计实现页面,在element自带的图标库好像没有,所以按钮的图标icon需要自定义,下面这篇文章主要给大家介绍了关于element使用自定义icon图标的两种解决方式,需要的朋友可以参考下
    2022-07-07
  • Vue3自定义指令的实践示例

    Vue3自定义指令的实践示例

    这篇文章主要为大家详细介绍了Vue3中自定义指令的实践,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-06-06
  • vue实现四级导航及验证码的方法实例

    vue实现四级导航及验证码的方法实例

    我们在做项目经常会遇到多级导航这个需求,所以下面这篇文章主要给大家介绍了关于vue实现四级导航及验证码的相关资料,文章通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • Vue 清除Form表单校验信息的解决方法(清除表单验证上次提示信息)

    Vue 清除Form表单校验信息的解决方法(清除表单验证上次提示信息)

    这篇文章主要介绍了Vue 清除Form表单校验信息的解决方法(清除表单验证上次提示信息),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Vue.js组件实现选项卡以及切换特效

    Vue.js组件实现选项卡以及切换特效

    这篇文章主要为大家详细介绍了Vue.js组件实现选项卡以及切换特效,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作

    vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作

    这篇文章主要介绍了vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论