数据准备
任务数据格式
{
"tasks": [
{
"id": "task1",
"name": "项目启动",
"start": "2024-01-01",
"end": "2024-01-05",
"progress": 100,
"dependencies": []
},
{
"id": "task2",
"name": "需求分析",
"start": "2024-01-06",
"end": "2024-01-15",
"progress": 80,
"dependencies": ["task1"]
}
]
}
数据结构要求
- 任务ID(唯一标识)
- 任务名称
- 开始日期
- 结束日期
- 进度(0-100%)
- 依赖关系(前置任务ID列表)
OpenClaw配置方法
基础配置
const ganttConfig = {
// 时间轴配置
timeScale: {
unit: "day",
step: 1,
format: "%Y-%m-%d"
},
// 任务栏配置
taskDisplay: {
height: 40,
padding: 5,
cornerRadius: 3
},
// 网格配置
grid: {
show: true,
strokeWidth: 1,
strokeColor: "#e0e0e0"
}
};
高级配置
const advancedConfig = {
// 缩放控制
zoom: {
min: 0.5,
max: 3,
step: 0.1
},
// 关键路径高亮
criticalPath: {
enabled: true,
color: "#ff6b6b"
},
// 里程碑标记
milestones: {
symbol: "diamond",
size: 12
}
};
实现方法
方法1:使用OpenClaw原生API
import { GanttChart } from 'openclaw';
// 初始化甘特图
const gantt = new GanttChart({
container: '#gantt-container',
tasks: tasksData,
config: ganttConfig
});
// 渲染
gantt.render();
// 更新数据
gantt.updateTasks(newTasksData);
方法2:React组件集成
import React, { useRef, useEffect } from 'react';
import OpenClaw from 'openclaw';
const OpenClawGantt = ({ tasks, config }) => {
const containerRef = useRef(null);
const ganttRef = useRef(null);
useEffect(() => {
if (containerRef.current) {
ganttRef.current = new OpenClaw.Gantt({
container: containerRef.current,
tasks,
...config
});
}
return () => {
if (ganttRef.current) {
ganttRef.current.destroy();
}
};
}, []);
return <div ref={containerRef} style={{ width: '100%', height: '600px' }} />;
};
方法3:Vue集成
<template>
<div ref="ganttContainer" class="gantt-chart"></div>
</template>
<script>
import OpenClaw from 'openclaw';
export default {
props: ['tasks', 'config'],
mounted() {
this.gantt = new OpenClaw.Gantt({
container: this.$refs.ganttContainer,
tasks: this.tasks,
...this.config
});
},
beforeDestroy() {
this.gantt.destroy();
}
};
</script>
自定义功能实现
拖拽调整任务时间
gantt.on('task-drag-end', (task, newStart, newEnd) => {
// 更新任务数据
updateTaskInDatabase(task.id, {
start: newStart,
end: newEnd
});
// 重新计算依赖任务
recalculateDependentTasks(task.id);
});
进度更新
// 更新任务进度
function updateTaskProgress(taskId, progress) {
gantt.updateTask(taskId, { progress });
// 如果进度100%,标记为完成
if (progress === 100) {
markTaskAsCompleted(taskId);
}
}
导出功能
// 导出为图片
function exportAsPNG() {
const dataURL = gantt.toDataURL('image/png');
downloadDataURL(dataURL, 'gantt-chart.png');
}
// 导出为PDF
function exportAsPDF() {
gantt.exportPDF({ '项目甘特图',
author: 'OpenClaw',
fileName: 'project-gantt.pdf'
});
}
// 导出为Excel
function exportAsExcel() {
const excelData = gantt.getExcelData();
// 使用SheetJS等库处理导出
}
最佳实践建议
性能优化
// 1. 虚拟滚动(大数据量时)
const config = {
virtualScroll: {
enabled: true,
batchSize: 50
}
};
// 2. 延迟渲染
gantt.setRenderMode('lazy');
// 3. 缓存计算
gantt.enableCache(true);
响应式设计
/* CSS响应式 */
.gantt-container {
width: 100%;
overflow-x: auto;
}
@media (max-width: 768px) {
.gantt-container {
font-size: 12px;
}
.gantt-task {
min-height: 30px;
}
}
错误处理
try {
const gantt = new GanttChart(config);
gantt.render();
} catch (error) {
console.error('甘特图初始化失败:', error);
// 降级方案:显示表格视图
showTableView(tasks);
}
与其他工具的集成
与项目管理工具集成
// 从JIRA导入数据
async function importFromJIRA(jiraQuery) {
const issues = await jiraAPI.search(jiraQuery);
const tasks = issues.map(issue => ({
id: issue.key,
name: issue.summary,
start: issue.startDate,
end: issue.dueDate,
progress: calculateProgress(issue)
}));
gantt.loadTasks(tasks);
}
实时协作
// WebSocket实时更新
const socket = new WebSocket('ws://your-server/gantt-updates');
socket.onmessage = (event) => {
const update = JSON.parse(event.data);
gantt.applyUpdate(update);
};
// 发送本地更新
function sendUpdate(change) {
socket.send(JSON.stringify(change));
}
注意事项
- 数据验证:确保任务日期逻辑正确,避免循环依赖
- 时区处理:统一使用UTC或项目所在时区
- 性能监控:大型项目需注意渲染性能
- 浏览器兼容性:考虑支持现代浏览器和移动端
- 可访问性:添加ARIA标签和键盘导航支持
这些方法可以根据实际项目需求进行调整和扩展。

版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。