Skip to content

Gantt-Chart 甘特图

支持 Tree Data、自动排程、虚拟列表及资源冲突检测的高性能甘特图组件。


TIP

YH-UI GanttChart 专为复杂项目管理场景设计,支持数万级数据的虚拟滚动、动态树形展示、基于依赖关系的自动排程逻辑,以及里程碑展示。

基础用法

甘特图组件旨在通过直观的时间轴展示任务进度及依赖关系。

search
Zoom
任务名称
开始日期
结束日期
系统研发中心 (Rollup)
2024-03-01
2024-03-31
回归测试
2024-04-01
2024-04-10
产品发布 (里程碑)
2024-04-12
2024-04-12
2024-02
2024-03
2024-04
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
回归测试
基础用法

交互、搜索与缩放

内置一体化工具栏,支持关键词搜索无级缩放(滑块调整)以及视图模式一键切换。开启 draggable 后,支持拖拽调整时间和进度。

search
Zoom
任务名称
开始日期
结束日期
系统研发中心 (Rollup)
2024-03-01
2024-03-31
回归测试
2024-04-01
2024-04-10
产品发布 (里程碑)
2024-04-12
2024-04-12
2024-02
2024-03
2024-04
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
回归测试
交互示例

里程碑 (Milestone)

当任务的开始日期和结束日期为同一天时,组件会自动将其渲染为菱形象征物,即里程碑。

自动识别

您只需将 startDateendDate 设置为同一个值(如同一天的零点),组件内部会自动转换为里程碑样式。

树形结构与汇总 (Rollup)

支持任务层级嵌套。父任务的时间会自动汇总子任务的时间范围。此外,系统自动渲染 树形导线 (Tree Lines) 以便于观察复杂的从属关系。

摘要条样式 (Summary Bar)

汇总任务在时间轴上会以特殊的样式(摘要条)展示,其两端带有向下延伸的垂直标记(挂耳),符合工业界主流甘特图视觉规范。

search
Zoom
任务名称
开始日期
结束日期
核心引擎开发 (Rollup)
2024-03-01
2024-03-31
2024-02
2024-03
2024-04
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
01
02
03
04
05
06
07
树形演示

自动排程

修改前置任务会导致后置任务自动联动。

search
Zoom
任务名称
开始日期
结束日期
前置任务 (拖我)
2024-03-01
2024-03-05
下游依赖任务
2024-03-10
2024-03-15
2024-02
2024-03
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
前置任务 (拖我)
下游依赖任务
自动排程演示

大数量虚拟滚动

支持渲染海量数据而不卡顿。

search
Zoom
任务名称
开始日期
结束日期
测试任务 #0
2024-03-01
2024-03-05
测试任务 #1
2024-03-01
2024-03-05
测试任务 #2
2024-03-01
2024-03-05
测试任务 #3
2024-03-01
2024-03-05
测试任务 #4
2024-03-01
2024-03-05
测试任务 #5
2024-03-01
2024-03-05
测试任务 #6
2024-03-01
2024-03-05
测试任务 #7
2024-03-01
2024-03-05
测试任务 #8
2024-03-01
2024-03-05
测试任务 #9
2024-03-01
2024-03-05
测试任务 #10
2024-03-01
2024-03-05
测试任务 #11
2024-03-01
2024-03-05
测试任务 #12
2024-03-01
2024-03-05
测试任务 #13
2024-03-01
2024-03-05
测试任务 #14
2024-03-01
2024-03-05
测试任务 #15
2024-03-01
2024-03-05
测试任务 #16
2024-03-01
2024-03-05
2024-02
2024-03
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
测试任务 #0
测试任务 #1
测试任务 #2
测试任务 #3
测试任务 #4
测试任务 #5
测试任务 #6
测试任务 #7
测试任务 #8
测试任务 #9
测试任务 #10
测试任务 #11
测试任务 #12
测试任务 #13
测试任务 #14
测试任务 #15
测试任务 #16
虚拟滚动演示

资源冲突检测

智能识别并高亮资源分配冲突。

search
Zoom
任务名称
开始日期
结束日期
模块A开发
2024-03-01
2024-03-10
需求回顾 (冲突)
2024-03-05
2024-03-06
2024-02
2024-03
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
模块A开发
需求回顾 (冲突)
资源冲突演示

高级用法

自定义任务渲染

通过 task-content 插槽可以完全自定义任务块的显示内容,添加图标、进度百分比等元素。

search
Zoom
任务名称
开始日期
结束日期
前端开发
2024-03-01
2024-03-10
后端开发
2024-03-05
2024-03-15
测试
2024-03-12
2024-03-20
2024-02
2024-03
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
📋前端开发75%
📋后端开发50%
📋测试30%
自定义任务渲染

自定义表格单元格

通过 table-cell 插槽可以为侧边栏的每个单元格自定义渲染,实现状态标签、头像等复杂展示。

search
Zoom
任务名称
状态
负责人
需求分析
已完成
张三
系统设计
计划中
李四
编码实现
进行中
王五
2024-02
2024-03
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
需求分析
系统设计
编码实现
自定义表格单元格

事件处理

监听各种交互事件以实现自定义逻辑。支持点击、双击、拖拽等多种事件。

📝 事件日志:
点击、双击或拖动任务查看事件触发...
search
Zoom
任务名称
开始日期
结束日期
点击我试试
2024-03-01
2024-03-05
拖动我试试
2024-03-06
2024-03-10
双击我试试
2024-03-11
2024-03-15
2024-02
2024-03
23
24
25
26
27
28
29
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
点击我试试
拖动我试试
双击我试试
事件处理示例

最佳实践

性能优化

  1. 大数据集使用虚拟滚动:当任务数量超过 100 时,建议开启 virtual 属性
  2. 合理设置视图模式:对于跨度较长的项目,使用 weekmonth 视图
  3. 按需加载子任务:对于深层嵌套的树形结构,考虑懒加载子节点
vue
<yh-gantt-chart v-model:data="tasks" :columns="columns" virtual view-mode="week" :row-height="40" />

数据结构建议

typescript
// ✅ 推荐:使用 ISO 8601 日期格式
const task = {
  id: 'task-1',
  name: '开发任务',
  startDate: '2024-03-01',
  endDate: '2024-03-15',
  progress: 60
}

// ✅ 推荐:明确的依赖关系
const tasks = [
  { id: 't1', name: '需求分析', startDate: '2024-03-01', endDate: '2024-03-05' },
  { id: 't2', name: '设计', startDate: '2024-03-06', endDate: '2024-03-10', dependencies: ['t1'] },
  { id: 't3', name: '开发', startDate: '2024-03-11', endDate: '2024-03-20', dependencies: ['t2'] }
]

资源管理

合理分配资源以避免冲突:

typescript
const tasks = [
  {
    id: 'task-1',
    name: '前端开发',
    startDate: '2024-03-01',
    endDate: '2024-03-10',
    assignees: ['developer-1', 'developer-2']
  },
  {
    id: 'task-2',
    name: '后端开发',
    startDate: '2024-03-01',
    endDate: '2024-03-10',
    assignees: ['developer-3'] // 避免与 task-1 的资源冲突
  }
]

常见问题

如何导出甘特图为图片?

可以使用 html2canvas 库:

typescript
import html2canvas from 'html2canvas'

const exportGanttChart = async () => {
  const ganttElement = document.querySelector('.yh-gantt-chart')
  if (ganttElement) {
    const canvas = await html2canvas(ganttElement)
    const link = document.createElement('a')
    link.download = 'gantt-chart.png'
    link.href = canvas.toDataURL()
    link.click()
  }
}

如何实现任务的批量操作?

typescript
// 批量更新任务状态
const updateTasksStatus = (taskIds: string[], status: string) => {
  tasks.value = tasks.value.map((task) => {
    if (taskIds.includes(task.id)) {
      return { ...task, status }
    }
    return task
  })
}

// 批量删除任务
const deleteTasks = (taskIds: string[]) => {
  tasks.value = tasks.value.filter((task) => !taskIds.includes(task.id))
}

如何自定义时间轴刻度?

通过 view-mode 和缩放功能可以调整时间轴显示:

vue
<yh-gantt-chart v-model:data="tasks" v-model:view-mode="viewMode" :columns="columns" />

<!-- 工具栏中会自动显示视图切换按钮 -->

如何处理跨时区的任务?

建议统一使用 UTC 时间或明确指定时区:

typescript
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'

dayjs.extend(utc)
dayjs.extend(timezone)

const task = {
  id: 'task-1',
  name: '全球会议',
  startDate: dayjs.tz('2024-03-01 09:00', 'America/New_York').toISOString(),
  endDate: dayjs.tz('2024-03-01 10:00', 'America/New_York').toISOString()
}

在 Nuxt 中使用

GanttChart 组件完全支持 Nuxt 3/4 的 SSR(服务端渲染)。在 Nuxt 项目中使用时,组件会自动导入,无需手动注册。

search
Zoom
任务名称
开始日期
结束日期
Nuxt SSR 渲染任务
2024-03-01
2024-03-05
首屏状态同步
2024-03-06
2024-03-10
2024-02
2024-03
W8
W9
W10
W11
Nuxt SSR 渲染任务
首屏状态同步
Nuxt 中使用

SSR 兼容性说明

  • 首屏渲染:甘特图的初始结构、任务列表和时间轴刻度均支持服务端渲染,提升 SEO 和首屏速度。
  • 状态同步:支持 v-model:datav-model:view-mode 的双向绑定,确保 SSR 状态在客户端完美激活(Hydrate)。
  • 自动导入:在 Nuxt 配置文件中启用 YH-UI 后,所有相关组件及类型均可直接使用。
  • ⚠️ 浏览器 API:拖拽交互和滚动监听仅在客户端环境生效,已做好环境隔离处理。

生产环境建议

对于包含上千条任务的大型项目,在 Nuxt 环境中建议开启 virtual 属性以获得极致的滚动性能。

API

Props

属性名说明类型默认值
data任务数据,支持树形结构GanttTask[][]
columns左侧表格列定义GanttColumn[][{ prop: 'name', label: '任务名称', width: 200 }]
view-mode视图模式,控制时间轴粒度'day' | 'week' | 'month' | 'year''day'
start-date强制指定甘特图开始日期Date | string自动计算
end-date强制指定甘特图结束日期Date | string自动计算
draggable是否允许拖拽调整任务时间booleanfalse
progress-draggable是否允许拖拽调整进度booleanfalse
auto-schedule是否开启自动排程(依赖任务联动)booleantrue
virtual是否开启虚拟滚动(大数据优化)booleanfalse
show-resource-load是否显示资源负荷检测booleantrue
show-dependencies是否显示任务依赖连线booleantrue
row-height行高(像素)number40
header-height头部高度(像素)number60
bordered是否显示边框booleantrue
loading是否显示加载状态booleanfalse
teleported内部浮层是否传送到 bodybooleantrue
theme-overrides主题变量覆盖ComponentThemeVars

Events

事件名说明回调参数
update:data任务数据更新时触发(data: GanttTask[])
update:view-mode视图模式变化时触发(mode: GanttViewMode)
task-click点击任务块时触发(task: GanttTask, event: MouseEvent)
task-dblclick双击任务块时触发(task: GanttTask, event: MouseEvent)
task-drag-end结束任务时间拖拽时触发(task: GanttTask)
progress-drag-end结束进度拖拽时触发(task: GanttTask)
dependency-click点击依赖连线时触发(from: GanttTask, to: GanttTask, event: MouseEvent)

Slots

插槽名说明参数
task-content自定义任务块内部内容{ task: GanttTask }
table-cell自定义侧边栏表格单元格{ row: GanttTask, column: GanttColumn, index: number }
tooltip自定义悬浮提示内容{ task: GanttTask }

Expose

当前组件未暴露公开实例方法或属性。

GanttTask 类型

属性名说明类型必填
id唯一标识string | number
name任务名称string
startDate开始日期string | number | Date
endDate结束日期string | number | Date
progress进度 (0-100)number
dependencies依赖的任务 ID 列表(string | number)[]
children子任务列表 (Tree Data)GanttTask[]
assignees资源负责人 ID 列表string[]
status状态预设(影响颜色)'success' | 'warning' | 'danger' | 'info' | 'default'
color自定义背景色string
textColor自定义文字颜色string
parentId父任务 IDstring | number
expanded是否展开(树形结构)boolean

GanttColumn 类型

属性名说明类型默认值
prop字段名string
label列标题string
width列宽度string | numberauto
align对齐方式'left' | 'center' | 'right''left'

主题变量

变量名说明默认值
--yh-gantt-border-color边框颜色var(--yh-border-color-light)
--yh-gantt-bg-color背景颜色var(--yh-bg-color)
--yh-gantt-header-bg-color头部背景色var(--yh-fill-color-light)
--yh-gantt-task-color任务块主色var(--yh-color-primary)
--yh-gantt-line-color网格线颜色var(--yh-border-color-lighter)

类型导出

名称说明
YhGanttChartProps组件 Props 类型
YhGanttChartEmits组件事件类型
YhGanttTask任务数据类型
YhGanttColumn列配置类型
YhGanttChartSlots组件插槽类型
YhGanttChartInstance组件实例类型

Released under the MIT License.