高性能 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

相关推荐
逐光老顽童3 小时前
用 Go 实现一个 LLM 路由网关:Thompson Sampling 与自适应故障转移实践
vue.js·go
xkxnq8 小时前
第八阶段:工程化、质量管控与高级拓展(132天),Vue项目文档自动化:VuePress搭建组件文档(组件示例+API说明)
javascript·vue.js·自动化
ct97810 小时前
Promise
前端·javascript·vue.js
rising start10 小时前
五、Vue3 ref 用法 + Props 完整指南
前端·javascript·vue.js
web打印社区10 小时前
前端html转换pdf并静默打印pdf最佳实现路径
前端·javascript·vue.js·electron·html
ct97810 小时前
ES6 新特性
前端·vue.js·性能优化
无聊的老谢21 小时前
Vue 3 + TypeScript 构建大型电信运维平台的前端架构设计
前端·vue.js·typescript
薛先生_0991 天前
vue-路由重定向
前端·javascript·vue.js
吠品1 天前
PyTorch 踩坑:libtorch_cpu.so 找不到 iJIT_NotifyEvent 符号
前端·vue.js·elementui