当前位置:首页 > VUE

vue实现甘特图展示

2026-03-28 19:55:49VUE

使用第三方库实现甘特图

推荐使用 vue-ganttasticdhtmlx-gantt 这类成熟的第三方库快速实现甘特图功能。vue-ganttastic 是一个轻量级 Vue 组件,适合简单需求;dhtmlx-gantt 功能更强大,支持复杂场景。

安装 vue-ganttastic

npm install vue-ganttastic

基础示例代码:

<template>
  <GanttChart
    :tasks="tasks"
    :options="options"
  />
</template>

<script>
import { GanttChart } from 'vue-ganttastic';
export default {
  components: { GanttChart },
  data() {
    return {
      tasks: [
        { id: 1, name: 'Task 1', start: '2023-01-01', end: '2023-01-05' },
        { id: 2, name: 'Task 2', start: '2023-01-06', end: '2023-01-10' }
      ],
      options: {
        viewMode: 'day',
        style: { height: '300px' }
      }
    };
  }
};
</script>

自定义实现甘特图

若需完全自定义,可通过 SVG 或 Canvas 绘制。以下为基于 SVG 的简化实现思路:

  1. 定义数据结构:

    tasks: [
    { id: 1, name: '开发', start: new Date(2023, 0, 1), end: new Date(2023, 0, 5), progress: 80 },
    { id: 2, name: '测试', start: new Date(2023, 0, 6), end: new Date(2023, 0, 10), progress: 30 }
    ]
  2. 计算时间轴和任务位置:

    computed: {
    timeRange() {
     // 计算最早开始时间和最晚结束时间
    },
    scaleX(value) {
     // 将日期转换为像素坐标
    }
    }
  3. 模板结构:

    <template>
    <div class="gantt-container">
     <div class="gantt-header">
       <!-- 时间轴刻度 -->
     </div>
     <svg class="gantt-body">
       <g v-for="task in tasks" :key="task.id">
         <rect 
           :x="scaleX(task.start)" 
           :width="scaleX(task.end) - scaleX(task.start)"
           y="30" 
           height="20" 
           fill="#4CAF50"
         />
         <!-- 进度条和文本 -->
       </g>
     </svg>
    </div>
    </template>

关键功能扩展

时间轴缩放
通过修改 viewMode(day/week/month)动态调整时间轴显示粒度,重计算 scaleX 函数。

任务交互
添加拖拽事件处理:

methods: {
  handleTaskDrag(task, newStart) {
    // 更新任务开始/结束时间
  }
}

依赖关系
使用箭头绘制任务间的关联线:

<line 
  v-for="link in links" 
  :x1="scaleX(getTask(link.source).end)" 
  :y1="getTaskY(link.source)" 
  :x2="scaleX(getTask(link.target).start)" 
  :y2="getTaskY(link.target)" 
  stroke="#999" 
  marker-end="url(#arrow)"
/>

样式优化建议

  1. 使用 CSS 变量统一颜色主题:

    .gantt-container {
    --bar-color: #4CAF50;
    --progress-color: #2E7D32;
    }
    rect.task-bar {
    fill: var(--bar-color);
    }
  2. 添加响应式布局:

    @media (max-width: 768px) {
    .gantt-header {
     font-size: 12px;
    }
    }

性能优化

对于大数据量场景:

vue实现甘特图展示

  • 虚拟滚动:只渲染可视区域内的任务
  • 防抖处理:频繁的时间轴缩放操作
  • Web Worker:复杂计算移至后台线程
// 虚拟滚动示例
visibleTasks() {
  return this.tasks.slice(
    Math.floor(this.scrollTop / this.rowHeight),
    Math.floor((this.scrollTop + this.containerHeight) / this.rowHeight)
  );
}

标签: 甘特图vue
分享给朋友:

相关文章

vue请求实现进度条

vue请求实现进度条

实现请求进度条的方法 在Vue中实现请求进度条可以通过多种方式完成,常见的有使用第三方库如axios结合nprogress或自定义进度条组件。以下是几种实现方法: 使用axios和nprogress…

vue 实现

vue 实现

Vue 实现的基本步骤 安装 Vue.js 可以通过 npm 或 CDN 引入。使用 npm 安装适合大型项目,CDN 适合快速原型开发。 npm install vue 在 HTML 文件中引入…

vue   实现单选

vue 实现单选

Vue 实现单选功能 在 Vue 中实现单选功能可以通过多种方式,以下是几种常见的方法: 使用原生 <input type="radio"> 绑定 v-model 通过 v-model…

vue实现滑块

vue实现滑块

Vue 实现滑块组件的方法 使用原生 HTML 和 Vue 指令 通过 Vue 的 v-model 和事件监听实现基础滑块功能。创建一个包含 input 元素的组件,类型设置为 range,并绑定到…

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…

vue 实现排序

vue 实现排序

Vue 实现排序的方法 使用计算属性实现排序 通过计算属性对数组进行排序,可以保持原始数据不变。示例代码展示了如何对列表按名称升序排序: <template> <div>…