当前位置:首页 > VUE

vue实现拖拽甘特图

2026-03-09 10:05:45VUE

Vue 实现拖拽甘特图的方法

使用现成组件库(推荐快速实现)

推荐使用 vue-gantt-elasticdhtmlx-gantt 这类专门为 Vue 封装的甘特图库,它们内置拖拽功能。

安装 vue-gantt-elastic

npm install vue-gantt-elastic

基础实现代码:

vue实现拖拽甘特图

<template>
  <gantt-elastic
    :tasks="tasks"
    :options="options"
    @task-dragged="handleTaskDrag"
  />
</template>

<script>
import GanttElastic from "vue-gantt-elastic";
export default {
  components: { GanttElastic },
  data() {
    return {
      tasks: [
        { id: 1, start: "2024-01-01", end: "2024-01-05", title: "任务1" }
      ],
      options: { 
        draggable: { enabled: true }
      }
    };
  },
  methods: {
    handleTaskDrag(payload) {
      console.log("拖拽更新:", payload);
    }
  }
};
</script>

自定义实现拖拽甘特图

如果需要完全自定义,可以结合以下技术栈:

  • 使用 <div> 和 CSS Grid/Flex 布局绘制甘特图
  • 通过 Vue 的 v-for 渲染任务条
  • 利用 HTML5 原生拖拽 API 或第三方库如 interact.js

核心拖拽逻辑示例:

vue实现拖拽甘特图

<template>
  <div class="gantt-container">
    <div 
      v-for="task in tasks" 
      :key="task.id"
      class="task-bar"
      draggable="true"
      @dragstart="dragStart(task)"
      @dragend="dragEnd"
      @dragover.prevent
      @drop="dropTask(task)"
    ></div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      tasks: [...],
      draggedTask: null
    }
  },
  methods: {
    dragStart(task) {
      this.draggedTask = task;
    },
    dropTask(targetTask) {
      // 更新任务位置逻辑
      const newTasks = this.tasks.map(t => 
        t.id === this.draggedTask.id 
          ? { ...t, start: targetTask.start } 
          : t
      );
      this.tasks = newTasks;
    }
  }
}
</script>

<style>
.gantt-container {
  display: grid;
  grid-template-columns: repeat(30, 1fr); /* 30天 */
}
.task-bar {
  background: #4CAF50;
  height: 20px;
  grid-column: span 3; /* 默认3天 */
}
</style>

关键功能实现要点

时间轴处理建议使用 moment.jsdate-fns 计算日期跨度:

import { format, addDays } from 'date-fns';

// 计算任务天数
const days = differenceInCalendarDays(
  new Date(task.end), 
  new Date(task.start)
);

拖拽边界检测需要限制任务不能超出甘特图范围:

dropTask(e) {
  const newStart = /* 计算新位置 */;
  if (newStart < this.minDate || newStart > this.maxDate) return;
  // 更新数据
}

性能优化建议

对于大数据量场景:

  • 使用虚拟滚动(如 vue-virtual-scroller
  • 节流拖拽事件处理
  • 使用 Vue 的 v-memo 优化重复渲染
<template>
  <div v-for="task in tasks" v-memo="[task.id, task.start]">
    <!-- 任务条内容 -->
  </div>
</template>

标签: 拖拽甘特图
分享给朋友:

相关文章

vue实现carousel拖拽

vue实现carousel拖拽

Vue实现Carousel拖拽功能 实现一个支持拖拽的Carousel组件可以通过结合Vue的响应式特性和原生DOM事件来实现。以下是具体实现方法: 基础Carousel结构 创建一个基础的Caro…

vue实现div拖拽

vue实现div拖拽

Vue 实现 Div 拖拽的方法 使用原生 HTML5 拖拽 API 在 Vue 中可以通过 HTML5 的拖拽 API 实现基础拖拽功能。需要为元素添加 draggable 属性,并监听 drags…

div拖拽实现vue

div拖拽实现vue

实现 Vue 中的 div 拖拽功能 在 Vue 中实现 div 拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 完成。以下是两种方法的详细实现: 使用 H…

vue实现拖拽旋转

vue实现拖拽旋转

Vue 实现拖拽旋转 核心思路 通过监听鼠标事件计算旋转角度,结合 CSS 的 transform: rotate() 实现旋转效果。需要处理 mousedown、mousemove 和 mouseu…

vue实现拖拽首页

vue实现拖拽首页

Vue 实现拖拽首页功能 实现拖拽功能通常需要结合 Vue 的指令和第三方库,以下是几种常见的方法: 使用 HTML5 原生拖拽 API HTML5 提供了原生的拖拽 API,可以通过 Vue 的指…

vue实现控件拖拽

vue实现控件拖拽

Vue 实现控件拖拽的方法 在 Vue 中实现控件拖拽功能可以通过原生 HTML5 的拖放 API 或第三方库(如 vuedraggable)来实现。以下是两种常见的方法: 使用 HTML5 拖放…