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后端接口返回十万条数据的资料请关注脚本之家其它相关文章!

相关文章

  • 如何使用vue-json-viewer插件展示JSON格式数据

    如何使用vue-json-viewer插件展示JSON格式数据

    这篇文章主要给大家介绍了关于如何使用vue-json-viewer插件展示JSON格式数据的相关资料,Vue-json-viewer是一个Vue组件,用于在Vue应用中显示JSON数据的可视化工具,需要的朋友可以参考下
    2023-11-11
  • 如何在Vue单页面中进行业务数据的上报

    如何在Vue单页面中进行业务数据的上报

    为什么要在标题里加上一个业务数据的上报呢,因为在咱们前端项目中,可上报的数据维度太多,比如还有性能数据、页面错误数据、console捕获等。这里我们只讲解业务数据的埋点。
    2021-05-05
  • vue页面更新patch的实现示例

    vue页面更新patch的实现示例

    这篇文章主要介绍了vue页面更新patch的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • 使用vite项目打包资源分配目录

    使用vite项目打包资源分配目录

    这篇文章主要介绍了使用vite项目打包资源分配目录方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Vue 获取数组键名的方法

    Vue 获取数组键名的方法

    本篇文章主要介绍了Vue 获取数组键名的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • vue3父组件调用子组件的方法例子

    vue3父组件调用子组件的方法例子

    这篇文章主要给大家介绍了关于vue3父组件调用子组件的方法例子,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-07-07
  • element中el-form-item属性prop踩坑

    element中el-form-item属性prop踩坑

    最近需要用到vue,在el-form-item属性prop上遇到报错或者没绑定到数据,本文主要介绍了element中el-form-item属性prop踩坑,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • vue封装自定义分页器组件与使用方法分享

    vue封装自定义分页器组件与使用方法分享

    这篇文章主要给大家介绍了关于vue封装自定义分页器组件与使用方法的相关资料,非常的好用,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 解决ele ui 表格表头太长问题的实现

    解决ele ui 表格表头太长问题的实现

    这篇文章主要介绍了解决ele ui 表格表头太长问题的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • Vue3+TypeScript实现中介者模式的详细过程

    Vue3+TypeScript实现中介者模式的详细过程

    在Vue3+TypeScript项目中,它适合组件通信、事件管理或复杂UI交互,本文给大家介绍Vue3+TypeScript实现中介者模式,感兴趣的朋友一起看看吧
    2025-06-06

最新评论