高性能 Vue 甘特图:vxe-gantt 如何秒级渲染万级任务数据

在项目管理、生产排程、资源调度等场景中,甘特图是核心可视化工具。然而,当任务数量达到数千甚至上万条时,传统 DOM 渲染方式会导致页面卡顿、滚动延迟,甚至浏览器崩溃。 vxe-gantt 组件通过内置的虚拟滚动(Virtual Scrolling) 技术,完美解决了大数据量下的渲染性能问题,能够在毫秒级完成万级任务的加载与交互。

通过 virtualYConfig 配置项,让你的甘特图轻松承载 10000+ 条任务,并保持流畅的滚动体验。

性能瓶颈与虚拟滚动原理

传统甘特图的痛点

  • 普通甘特图实现会将所有任务行(包括任务条、依赖线、时间轴标记)全部渲染为 DOM 节点。当任务数达到 10000 条时,DOM 节点数量可能超过 10 万个,导致:
    • 初始化渲染耗时数秒甚至十几秒
    • 滚动、缩放等交互严重卡顿
    • 内存占用极高,移动端尤其明显

虚拟滚动的核心思想

  • 只渲染可视区域内的任务行,随着滚动动态加载和销毁不可见区域的行。虚拟滚动技术将 DOM 节点数量控制在"可视行数 × (每行子节点数)"的常数范围内(通常仅几十到上百个节点),从而:
    • 首屏渲染时间降低至毫秒级
    • 滚动流畅度与数据量解耦
    • 内存占用稳定可控

vxe-gantt 的虚拟滚动实现基于 Y 轴方向 的虚拟滚动(virtualYConfig),同时也支持 X 轴方向的虚拟滚动(virtualXConfig)应对超长时间线。

配置方法

在 vxe-gantt 中,通过 virtualYConfig 对象启用垂直虚拟滚动:

属性 类型 说明
enabled boolean 虚拟滚动总开关,设为 true 开启
gt number 阈值:当总行数 大于 该值时自动启用虚拟滚动(建议设置为 0,表示任何行数都启用)

代码

使用 vxe-gantt 加载 10000 条模拟任务,并通过虚拟滚动实现流畅滚动:

html 复制代码
<template>
  <div>
    <vxe-gantt v-bind="ganttOptions"></vxe-gantt>
  </div>
</template>

<script setup>
import { reactive } from 'vue'

const ganttOptions = reactive({
  border: true,
  showOverflow: true,
  showHeaderOverflow: true,
  showFooterOverflow: true,
  height: 600,
  virtualYConfig: {
    enabled: true,
    gt: 0
  },
  taskBarConfig: {
    showProgress: true,
    showContent: true
  },
  taskViewConfig: {
    tableStyle: {
      width: 480
    }
  },
  columns: [
    { type: 'seq', width: 70 },
    { field: 'title', title: '任务名称' },
    { field: 'start', title: '开始时间', width: 100 },
    { field: 'end', title: '结束时间', width: 100 }
  ],
  data: []
})

// 模拟行数据
const loadList = (size = 200) => {
  const dataList = []
  for (let i = 0; i < size; i++) {
    dataList.push({
      id: 10000 + i,
      title: `任务计划${i + 1}`,
      start: i % 3 ? '2024-03-03' : i % 2 ? '2024-03-05' : '2024-03-09',
      end: i % 3 ? '2024-03-11' : i % 2 ? '2024-03-19' : '2024-03-14',
      progress: i % 2 ? 50 : 30
    })
  }
  ganttOptions.data = dataList
}

loadList(10000)
</script>
  • 运行效果:
    • 页面打开后约 0.2~0.5 秒即可完成首屏渲染
    • 滚动条顺滑无延迟,任务条实时更新
    • 内存占用稳定在几十 MB 级别

vxe-gantt 基于 vxe-table 实现,内置高性能的虚拟滚动功能,使得甘特图能够轻松应对万级任务数据量,将渲染性能从"数十秒不可用"提升到"毫秒级秒开"。通过简单的 virtualYConfig 配置,即可让您的项目管理应用拥有企业级的数据承载能力。

gantt.vxeui.com

相关推荐
Southern Wind6 小时前
AIAgent——第一章:本地 Agent 与 Vue 3 流式全栈实战
前端·javascript·vue.js
ym hyd 1119 小时前
生鲜超市库存管理信息系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·vue.js·spring boot·毕设
FYKJ_20109 小时前
express绿叶横店短剧推荐与影评分享平台34219-计算机课程设计、毕业设计
java·javascript·vue.js·spring boot·后端·课程设计·express
Eric.469 小时前
毕设实战|SpringBoot+Vue 实现多个系统项目
vue.js·spring boot·课程设计
一颗小芹菜的日常9 小时前
vue-crack插件是干什么的
前端·javascript·vue.js
peter676810 小时前
vue学习小结
前端·vue.js·学习
web3d5201 天前
Vue3 地图白屏排查清单:容器、弹窗与 ol-viewport 重复创建
vue.js·gis
hai_android1 天前
一个公式看懂动态跨表查找:P8 + VLOOKUP
前端·javascript·vue.js
wdssmq1 天前
「折腾」Vue 简单的状态管理实践
vue.js
Q26433650231 天前
【有源码】基于Spring Boot和Vue的在线考试与交流系统-教育信息化背景下在线考试与交流一体化平台
java·vue.js·spring boot·mysql·spring·毕业设计·课程设计