vue实现拖拽甘特图
实现拖拽甘特图的核心步骤
使用Vue实现拖拽甘特图需要结合拖拽库和可视化组件。推荐使用vue-draggable或原生HTML5拖拽API,配合自定义渲染逻辑。
安装必要依赖
确保项目已安装vuedraggable和日期处理库(如dayjs):
npm install vuedraggable dayjs
基础甘特图结构
创建Vue组件,定义任务数据结构和甘特图布局:
<template>
<div class="gantt-container">
<div class="gantt-header">
<!-- 时间轴标题 -->
</div>
<draggable
v-model="tasks"
@end="onDragEnd">
<div v-for="task in tasks" :key="task.id" class="gantt-task">
{{ task.name }}
</div>
</draggable>
</div>
</template>
处理拖拽逻辑
实现拖拽后的日期计算和位置更新:
export default {
data() {
return {
tasks: [
{ id: 1, name: 'Task 1', start: '2023-01-01', end: '2023-01-05' }
]
}
},
methods: {
onDragEnd(event) {
const taskIndex = event.oldIndex;
const newXPosition = event.newX;
this.updateTaskDates(taskIndex, newXPosition);
},
updateTaskDates(index, pixels) {
const days = Math.round(pixels / this.pixelsPerDay);
this.tasks[index].start = dayjs(this.tasks[index].start)
.add(days, 'day')
.format('YYYY-MM-DD');
}
}
}
样式布局
添加CSS实现甘特图视觉布局:
.gantt-container {
display: grid;
grid-template-columns: 200px repeat(30, 50px);
}
.gantt-task {
grid-column: span 5; /* 根据任务时长调整 */
background: #4CAF50;
height: 30px;
cursor: move;
}
进阶功能实现
- 时间缩放:通过动态调整
pixelsPerDay变量实现 - 依赖关系:使用SVG绘制任务间的箭头连线
- 状态管理:复杂场景建议使用Vuex管理任务状态
推荐扩展方案
对于企业级应用,可考虑:
- 集成现成库如
dhtmlx-gantt - 使用Canvas或SVG进行高性能渲染
- 添加右键菜单进行任务编辑
关键要点是结合拖拽事件与日期计算逻辑,实时更新任务时间位置。通过CSS Grid布局可以简化甘特图的视觉对齐问题。







