Code前端首页关于Code前端联系我们

Vue3项目里怎么快速上手一个好用的甘特图组件?

terry 3小时前 阅读数 31 #Vue
文章标签 Vue3甘特图组件

上手甘特图组件前,得先想清楚:咱们做这个甘特图是给谁看的?需要哪些核心功能?别上来就随便找个npm包装,装完才发现要么功能冗余卡页面,要么核心的拖拽调整、资源分配没有,白忙活一场。

选对Vue3甘特图组件的标准是什么?

先理清楚刚需和加分项,别被花里胡哨的demo晃了眼,刚需是基础,必须满足;加分项是弹性,留足后期优化空间。

  • 核心刚需要卡牢:这几个功能做项目管理类甘特图90%的场景都用得到——能拖拽调整任务的开始结束时间、拖拽改变任务层级(比如把子任务拖到别的父任务下)、显示任务依赖关系(带箭头的那种连接线)、支持不同视图切换(日/周/月/季视图,甚至年视图看长线项目),这些功能如果让自己手写,没有半个月搞不定,而且兼容性和性能很难保证。
  • 性能要抗打:如果是做中型或大型项目,比如有上百条甚至上千条任务的甘特图,用原生Canvas或者优化得不好的DOM库会直接卡成PPT,这时候最好优先选底层用Canvas渲染或者有虚拟滚动技术的组件,虚拟滚动技术挺实用的,就是只渲染你屏幕当前能看到的任务条,其他的暂时不渲染,等你滚动的时候再动态替换,这样不管任务多少,页面加载和操作都很流畅。
  • Vue3适配要完善:不能选只支持Vue2的老组件,适配起来太麻烦,还要改很多源码,容易出bug,最好是专门为Vue3设计的,或者官方明确说完美兼容Vue3 Composition API的,这样写代码的时候可以用ref、reactive、computed这些特性,和咱们的Vue3项目风格统一,维护起来也方便。
  • 文档要友好:很多人忽略这点,但文档真的太重要了!如果文档全是英文,而且例子只有简单的静态展示,没有拖拽调整、资源绑定、自定义样式这些进阶用法的完整示例,那踩坑的时间可能比开发功能的时间还长,优先选有中文文档、示例多、API写得清楚的组件。
  • 扩展性要强:毕竟每个项目的需求都不一样,比如有的需要给任务条加自定义的图标(比如紧急任务加个红色感叹号),有的需要在任务条上显示负责人头像,有的需要导出PDF或者Excel,这时候组件就得支持插槽、自定义渲染函数、事件钩子这些功能,方便咱们二次开发。

现在有哪些符合要求的Vue3甘特图组件?

我整理了几个常用的,覆盖了免费开源和商业付费的场景,可以根据自己的项目预算和需求选。

  • gantt-schedule-timeline-vue(轻量级免费首选):这个是专门为Vue3打造的轻量级甘特图组件,底层用的是Canvas渲染,性能还不错,上百条任务没问题,核心刚需基本都满足——拖拽调整时间、层级,显示依赖关系,视图切换,资源分配也有基础版,支持中文文档,API写得比较简洁,还有10+个完整的demo,从入门到进阶都有,最关键的是完全免费开源,MIT协议,个人和商业项目都能用,没有任何限制,缺点是功能没有商业组件那么全,比如没有自动排班、甘特图分组的高级功能,自定义任务条的样式稍微麻烦一点,需要用Canvas的API。
  • DHTMLX Gantt Vue3(商业付费的全能选手):这个应该是目前市面上功能最全、性能最好的甘特图组件之一了,专门做甘特图做了10多年,口碑很不错,完美支持Vue3 Composition API,底层同时支持DOM和Canvas渲染(可以自己选,DOM渲染适合自定义样式,Canvas渲染适合高性能场景),核心刚需不用说,完全满足,而且有很多高级功能——自动计算关键路径、自动调整任务冲突、资源利用率图表、甘特图分组筛选、导出PDF/Excel/PNG、多语言支持(内置30+种语言,中文没问题)、暗色主题,文档超级详细,有中文的,还有视频教程,demo更是有上百个,几乎覆盖了所有能想到的场景,缺点是商业付费,个人学习版免费但有水印,商业项目需要购买授权,价格不算便宜,但如果是做企业级项目,这个钱花得挺值的,能节省大量的开发时间。
  • ECharts Timeline(适合简单的项目进度展示):ECharts大家应该都很熟悉,是百度开源的可视化库,功能超级强大,虽然它不是专门做甘特图的,但用它的Timeline组件加上Bar系列,可以实现简单的甘特图功能,比如显示任务的开始结束时间,支持视图切换,自定义任务条的颜色和样式,优点是完全免费开源,性能好,ECharts的社区非常活跃,遇到问题很容易找到解决方案,和Vue3的适配也很完善,有官方的vue-echarts组件,缺点是核心的甘特图功能缺失,比如拖拽调整时间、层级,显示依赖关系,这些都需要自己手写或者用第三方插件,开发成本比较高,只适合做不需要交互、只需要展示的简单甘特图。

用gantt-schedule-timeline-vue做一个简单的Vue3甘特图,具体步骤是什么?

选轻量级免费的gantt-schedule-timeline-vue做示例吧,上手最快,没有门槛。 得先准备一个Vue3项目,如果没有的话,可以用Vite快速创建一个:

npm create vite@latest my-gantt-project -- --template vue
cd my-gantt-project
npm install

安装gantt-schedule-timeline-vue组件:

npm install gantt-schedule-timeline-vue

打开src/App.vue文件,把里面的内容删掉,换成我们的甘特图代码: 引入组件和样式:

import { GanttScheduleTimelineVue } from 'gantt-schedule-timeline-vue'
import 'gantt-schedule-timeline-vue/dist/style.css'

准备甘特图的数据:需要任务数据、资源数据(可选)、配置项,任务数据里必须有id、name、start、end这几个字段,还可以有parentId(父任务的id,用来做层级)、progress(进度百分比)、dependencies(依赖关系,数组格式,每个元素是依赖的任务id)这些字段,资源数据里必须有id、name这两个字段,用来给任务分配负责人,配置项可以设置视图的默认类型、时间范围、是否允许拖拽调整时间/层级、是否显示依赖关系这些。

import { ref } from 'vue'
// 任务数据
const tasks = ref([
  { id: 1, name: '项目启动', start: new Date(2024, 5, 1), end: new Date(2024, 5, 5), progress: 100 },
  { id: 2, name: '需求调研', start: new Date(2024, 5, 6), end: new Date(2024, 5, 15), progress: 80, parentId: 1, dependencies: [1] },
  { id: 3, name: 'UI设计', start: new Date(2024, 5, 10), end: new Date(2024, 5, 20), progress: 50, parentId: 1, dependencies: [2] },
  { id: 4, name: '前端开发', start: new Date(2024, 5, 16), end: new Date(2024, 6, 5), progress: 30, parentId: 1, dependencies: [3] },
  { id: 5, name: '后端开发', start: new Date(2024, 5, 16), end: new Date(2024, 6, 10), progress: 40, parentId: 1, dependencies: [3] },
  { id: 6, name: '测试', start: new Date(2024, 6, 6), end: new Date(2024, 6, 15), progress: 0, parentId: 1, dependencies: [4, 5] },
  { id: 7, name: '上线', start: new Date(2024, 6, 16), end: new Date(2024, 6, 20), progress: 0, parentId: 1, dependencies: [6] }
])
// 资源数据(可选)
const resources = ref([
  { id: 1, name: '张三' },
  { id: 2, name: '李四' },
  { id: 3, name: '王五' }
])
// 配置项
const config = ref({
  viewType: 'week', // 默认视图:日/周/月/季/年
  minDate: new Date(2024, 4, 20), // 最小时间范围
  maxDate: new Date(2024, 7, 1), // 最大时间范围
  dragEnabled: true, // 是否允许拖拽调整时间
  treeDragEnabled: true, // 是否允许拖拽改变层级
  dependenciesEnabled: true, // 是否显示依赖关系
  progressEnabled: true, // 是否显示进度条
  resourcesEnabled: true // 是否显示资源列(可选)
})

监听甘特图的事件,比如任务调整时间、改变层级、点击任务这些,方便我们做后续的处理,比如保存到后端:

// 任务调整时间事件
const onTaskTimeChanged = (task) => {
  console.log('任务时间调整了:', task)
  // 这里可以写保存到后端的代码
}
// 任务改变层级事件
const onTaskParentChanged = (task) => {
  console.log('任务层级改变了:', task)
  // 这里可以写保存到后端的代码
}
// 任务点击事件
const onTaskClicked = (task) => {
  console.log('任务被点击了:', task)
  // 这里可以写打开任务详情弹窗的代码
}

在模板里使用组件:

<template>
  <div class="gantt-container">
    <h1>我的项目甘特图</h1>
    <GanttScheduleTimelineVue
      :tasks="tasks"
      :resources="resources"
      :config="config"
      @task-time-changed="onTaskTimeChanged"
      @task-parent-changed="onTaskParentChanged"
      @task-clicked="onTaskClicked"
    />
  </div>
</template>
<style scoped>
.gantt-container {
  width: 100%;
  height: 800px;
  padding: 20px;
  box-sizing: border-box;
}
</style>

运行项目看看效果:

npm run dev

打开浏览器访问http://127.0.0.1:5173/,就能看到一个功能完整的甘特图了!可以拖拽调整任务的开始结束时间,拖拽改变任务的层级,点击任务条,或者调整视图的时间范围,都很流畅。

甘特图组件开发过程中常见的坑有哪些?怎么解决?

虽然选对了组件能节省很多时间,但开发过程中还是会遇到一些坑,我整理了几个我踩过的,还有身边朋友踩过的,分享给大家。

  • 任务时间格式不对导致显示异常:很多甘特图组件只支持Date对象格式的时间,不支持字符串格式的时间(2024-06-01'),如果直接传字符串,任务条可能不会显示,或者显示的时间不对,解决方法就是把字符串格式的时间转换成Date对象,可以用new Date(),也可以用moment.js或者day.js这些日期库,推荐用day.js,轻量好用,完全免费开源。
  • 任务数据量大导致页面卡顿:如果用的是DOM渲染的组件,任务数据量超过100条可能就会卡顿,超过500条直接卡成PPT,解决方法就是换用底层用Canvas渲染或者有虚拟滚动技术的组件,比如gantt-schedule-timeline-vue或者DHTMLX Gantt Vue3,如果已经用了DOM渲染的组件,不想换的话,可以试试分页加载任务数据,或者只加载当前时间范围内的任务数据。
  • 自定义任务条样式不生效:不同的甘特图组件自定义任务条样式的方法不一样,有的用CSS类名,有的用插槽,有的用自定义渲染函数,如果直接用普通的CSS类名修改,可能因为组件的样式隔离导致不生效,解决方法就是先看组件的文档,搞清楚自定义任务条样式的正确方法,如果是用插槽的话,记得在插槽里写的内容会覆盖组件默认的任务条;如果是用自定义渲染函数的话,可能需要用Canvas的API或者虚拟DOM的API。
  • 依赖关系显示不正确:很多甘特图组件的依赖关系是通过任务的dependencies字段来设置的,dependencies字段的格式是数组,每个元素是依赖的任务id,但有的组件可能要求每个元素是一个对象,里面有id和type(比如finish-to-start,start-to-start这些),如果格式不对,依赖关系的箭头可能不会显示,或者显示的位置不对,解决方法就是仔细看组件的文档,搞清楚dependencies字段的正确格式。
  • 导出PDF或者Excel的时候样式乱掉:导出功能是很多项目都需要的,但如果用的是免费开源的组件,导出功能可能比较弱,导出的PDF或者Excel样式会乱掉,解决方法就是如果预算允许的话,换用有专业导出功能的商业组件,比如DHTMLX Gantt Vue3;如果预算有限的话,可以试试用html2canvas和jspdf自己写导出PDF的功能,用xlsx自己写导出Excel的功能,但开发成本比较高,而且效果可能不如商业组件。

Vue3项目里快速上手好用的甘特图组件,首先要理清楚自己的刚需和加分项,选对组件;然后看文档,跟着示例写代码;最后注意避开常见的坑,如果是个人项目或者简单的项目,推荐用gantt-schedule-timeline-vue,完全免费开源,上手快,核心功能够用;如果是企业级项目或者需要高级功能,推荐用DHTMLX Gantt Vue3,功能全,性能好,文档详细,虽然付费但能节省大量的开发时间;如果是不需要交互、只需要展示的简单甘特图,推荐用ECharts Timeline,完全免费开源,社区活跃,和Vue3适配完善。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门