Vue3项目使用vue-ganttastic🏆

前段时间公司要求用甘特图记录设备工单的工时,并要求能够调整工单时间范围和画布的时间跨度,因此我搜集了大量相关资料,整理出四个甘特图插件:vue-gantt-chartgantt-elasticvue-ganttasticdhtmlx-gantt,但从技术角度来看至少需要具备拖拽、行内多个bar、调整bar大小、调整画布的时间轴精度功能,且不需要箭头关联、跨行、树形菜单,所以只剩下vue-ganttastic可用了。

前言🍟

本文根据vue-ganttastic的官方文档、源码进行讲解,并说明此插件存在的bug,借此提供一个本人实践的demo,此demo已修复插件的大部分bug,demo地址在后面。

vue-ganttastic官方文档阅读指南·问题清单🍚🌭

官方文档链接:https://zunnzunn.github.io/vue-ganttastic/,请仔细阅读官方文档,本文仅对部分混淆、不易理解、重点的api做阐述。
官方demo图片:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Vue2中能否使用vue-ganttastic?🥓

在这里插入图片描述
介绍里面说明了此插件是为Vue3开发的,支持Vue3、TypeScript。有的同学想在Vue2项目中使用此插件,那么到底可不可行?这个问题也是有迹可循的。
进入插件的github地址,往下翻阅可以看到:
在这里插入图片描述
即源码的vue-ganttastic-v1分支,实践一遍,相较于master分支(Vue3版本)发现很多功能并未实现,且没有相关文档,无法正常使用,还是乖乖用Vue3项目集成vue-ganttastic吧。

bar配置项🍰

在这里插入图片描述
所以一个完整的bar配置如下:

{
  myBeginDate:    '2021-07-13 00:00', // bar的开始时间
  myEndDate:      '2021-07-14 02:00', // bar的结束时间
  ganttBarConfig: {
    id:         'another-unique-id-2', // bar的id,确定bar的唯一性
    hasHandles: true, // true:可调整bar宽度;false:不可调整bar宽度(默认)
    // immobile:   true, // true:不可拖拽;false:可拖拽(默认)
    bundle:     'bundle2', // 值相同的bar绑定在一起,拖拽其中一个,其他绑定的bar会做出相同动作
    label:      'Hey, look at me', // 展示在bar中的内容
    style:      { // bar样式,可以是任意css属性
      background:   '#e09b69',
      borderRadius: '20px',
      color:        'black',
    },
  },
}

当时间跨度大于一年且g-gantt-chart标签的precision属性(后面会讲)为day时会出现主时间轴最后一格不显示的bug,在不修改源码的情况下无法修复。
在这里插入图片描述

画布展示维度🥫

在这里插入图片描述
设置g-gantt-chart标签的precision属性为hour,请注意时间轴的变化:
在这里插入图片描述
设置g-gantt-chart标签的precision属性为day,请注意时间轴的变化:
在这里插入图片描述
设置g-gantt-chart标签的precision属性为month,请注意时间轴的变化:
在这里插入图片描述

时间轴日期时间国际化🥮

在这里插入图片描述
在src/main.js文件中加入以下代码即可配置时间轴日期时间为中文:

import { createApp } from 'vue';
import App from './App.vue';
import router from './router';
import ganttastic from '@infectoone/vue-ganttastic';
import dayjs from 'dayjs';
import 'dayjs/locale/zh-cn';

// 全局使用中文
dayjs.locale('zh-cn');

const app = createApp(App);

app.use(router).use(ganttastic)
  .mount('#app');

g-gantt-chart相关api注意事项

设置date-format导致报错🍠

在这里插入图片描述
date-format默认值为YYYY-MM-DD HH:mm,根据属性描述翻译过来:
在这里插入图片描述
按照day.js的日期格式修改,例如YYYY-MM-DD HH:mm:ss,会导致画布时间轴、bar解析失败,修改其他时间格式也是如此:
在这里插入图片描述

两个影响需求的关键属性🥗

插件默认push-on-overlap、no-overlap属性为false,此时插件画布的bar表现为bar与bar之间的时间范围可以有交集,且可以自由交换,完全不受其他bar的影响。而push-on-overlap、no-overlap属性则带来了不同场景的解决方案。

push-on-overlap🥠

在这里插入图片描述
push-on-overlap属性可实现bar拖拽推动两边的bar,适用于bar不可交换的情况,先后顺序是固定的,也由此出现了许多bug(后面讲解)。

no-overlap🍤

在这里插入图片描述
no-overlap属性可实现bar拖拽不影响其他bar,且不能与其他bar的时间范围有交集,如有交集则恢复拖拽前的位置,适用于bar可以交换的情况,自由度较高。

值得关注的事件:dragend-bar🥘

在这里插入图片描述
dragend-bar事件有四个回调参数:

  • bar:拖拽的bar的bars对象,即上面的代码块所呈现的bar的配置
  • e:鼠标事件对象
  • movedBars:当push-on-overlap属性为true时,为拖拽bar时所推动的其他bar的集合
  • {oldStart: string, oldEnd: string}:拖拽前bar的开始、结束时间

其他事件就不细谈了,顾名思义。

插槽🍘

在这里插入图片描述

  • upper-timeunit:主时间轴自定义内容,插槽提供三个参数label、value、date,可自行打印查看
  • timeunit:次时间轴自定义内容,插槽提供三个参数label、value、date,可自行打印查看
  • bar-tooltip:自定义鼠标悬浮到bar上所显示提示框内容,插槽提供一个参数bar,即为此bar的bars对象,可自行打印查看

刚看到它,还没看明白怎么用、在哪里用,于是乎在IDE中打开源码,通过搜索关键词很快就能找到答案,例如upper-timeunit插槽:
在这里插入图片描述
其他插槽也可以这样找到,就可以很清楚的知道它的使用方法。插件源码地址:https://github.com/zunnzunn/vue-ganttastic,有兴趣的小伙伴可以拉下来啃一啃。

g-gantt-row相关api注意事项🥚

插槽🥙

在这里插入图片描述

  • label:自定义行内左上角悬浮的label的内容
  • bar-label:自定义bar中显示的内容,插槽提供一个参数bar,即为此bar的bars对象,可自行打印查看

插件bug及解决方案🎁

注:目前发现的插件bug均于push-on-overlap属性为true时出现。
附上本人修复bug后的demo:https://gitee.com/jarry_ee/gant-canvas,拉下来后请切换到push-on-overlap分支。

拖拽速度过快时不会推动旁系bar,会直接穿过🎨

在这里插入图片描述

拖拽时靠近immobile属性为true的bar时会变卡顿,经常脱离鼠标控制🍱

在这里插入图片描述

拖拽时会推动immobile属性为true的bar🥫

代码太长不适合截图,相关逻辑在ganttastic.vue文件中的draging方法,可自行阅读并加以理解。

视图优化🥩

precision属性为day时,画布会在时间轴最后一格会出现挤压变形的日期,该日期是画布结束日期之后的一天:
在这里插入图片描述
precision属性为hour时,当画布的时间范围过大时,次时间轴最右边一格出现空白,并显示下一天的时间点:
在这里插入图片描述
我们在代码中这样优化:
在这里插入图片描述
注意!代码中只做了precision属性为day和hour时的处理,目前month还未发现问题。

谢谢捧场~~🍉

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐