Vue使用 dhtmlx-gantt 甘特图

使用心得和一些坑分享出来

下载

 npm install  dhtmlx-gantt  -save

创建 ganttVue 组件

<template>
 	// ref 引用这个dom
  <div ref="gantt" class="highcharts-container"></div>
</template>
<script>
	// 引入 组件库
	import 'dhtmlx-gantt'
	import { gantt } from 'dhtmlx-gantt'
	export default{
	  name: 'gantt',
	 // 接受父级组件 传递的数据并规范类型 
	  props: {
	    tasks: {
	      type: Object,
	      default() {
	      	// data 数据  links 数据连接关系
	        return { data: [], links: [] }
	      },
	    },
	  },
	}
	methods:{
		 Add(task ,e) {
     // 通过 任务Id 来获取任务 
    var obj= gantt.getTask(task);
      console.log(obj)
      
      return false;
    },
	},
	// 卸载事件把所有绑定在Event 上的事件都卸载掉 官网好像有一个属性也可以配置 但是没使用
	destroyed(){
    	
    this.events.forEach(ele => {
      gantt.detachEvent(ele)
    })
   // gantt=null;
   gantt.clearAll();
  },
	// 初始化
	mounted(){
		//清除所有数据
		gantt.clearAll();
		// 格式化父级 数据  官网文档要求   {
			id,
			text 文本,
			start_date 开始时间,
			end_date 结束时间,
			progress 进度 100%1,
			name 名称,
			parent 父级Id 和上面的Id 要是想对应的
		}
		for (let i = 0; i < this.$props.tasks.data.length; i++) {
	      var task = this.$props.tasks.data[i]
	      this.$props.tasks.data[i] = {
	          id:task.id,
	          text: task.stepName,
	          start_date: new Date(this.$moment(task.startTime).format('YYYY-MM-DD')),
	          end_date: new Date(this.$moment(task.endTime).format('YYYY-MM-DD')),
	          progress: task.amount / 100,
	          name: task.stepName,
	          parent: task.parentId==0?"0":task.parentId,
	        }  
	    }
	    	// 配置
		 	gantt.config.open_split_tasks = true
		 	// 双击开启默认编辑框禁用
		    gantt.config.details_on_dblclick = false;
		    // 单击开启默认编辑框禁用
		    gantt.config.details_on_click = false;
		     // 下面是一些拖拽禁用 详情可以去看官方文档
		    gantt.config.drag_lightbox = false
		    gantt.config.drag_progress = false
		    gantt.config.drag_links = false
		    gantt.config.drag_move = false
		    gantt.config.drag_resize = false
		    // 开启提示
			 gantt.plugins({
		      marker: true,
		      tooltip: true,
		    })
		   // 设置表头 和对应的时间格式化 而且还可以设置步长
		    gantt.config.scales = [
			      { unit: 'year', format: '%Y年' },
			      { unit: 'month', format: '%M' },
			    //  { unit: 'day', step: 1, format: "%m月 %j号, 周%D" },
			    ]
		  // 设置表头 左侧表格描述   tree:true  是开启树结构
			  gantt.config.columns = [
		      { name: 'text', label: '任务名称', width: '120', align: 'center',tree:true },
		      { name: 'start_date', label: '开始时间', width: '100', align: 'center'} ,
		      { name: 'end_date', label: '结束时间', width: '100', align: 'center' },
		      {name:"duration",   label:"总用时/天",   align: "center" },
		      {name:"add",      align: "center" }
		    ]   
		     gantt.i18n.setLocale('cn') // 设置中文
			 // 设置时间表头高度 
			  gantt.config.scale_height=88;
			  gantt.config.bar_height = 24 //task高度
			  	// 函数作用域问题 需要把this 赋值给That;  moment.js 的时间转换
			   let that = this
			    gantt.templates.tooltip_text = function (start, end, task) {
			      return (
			        '<a-card> <b>任务名称:</b>' +
			        task.id +
			        '<br/><b>开始时间:</b> ' +
			        that.$moment(task.start_date).format('YYYY-MM-DD') +
			        '<br/><b>结束时间:</b> ' +
			        that.$moment(task.end_date).format('YYYY-MM-DD') +
			        '</a-card>'
			      )
			    }
			    // 自动大小自适应
			     gantt.config.autosize = true
			    //任务条上的文字大小 以及取消border自带样式
			    gantt.templates.task_class = function () {
			      return 'firstLevelTask'
			    }
			    // 初始化甘特图
			    gantt.init(this.$refs.gantt)
				// 初始化数据
				gantt.parse(this.$props.tasks)
				// 绑定事件 点击创建任务按钮的 反正两个都要加上去 不加上去 默认创建没有父级任务的会把组件内置的弹出 目前就研究出这个方法
				let onTaskCreated=  gantt.attachEvent('onTaskCreated',(e)=>{
			      console.log(e);
			      return false;
			    });
			    let onTaskClick=  gantt.attachEvent('onTaskClick',this.Add);
			    this.events.push(onTaskClick)
			   this.events.push(onTaskCreated)
			   	// 循环把所有树展开
			    gantt.eachTask(function (task) {
			      task.$open = true
			    })
	},
	 data(){
    return{
 	 // 后续存储绑定事件 在组件卸载时候 需要把 事件也卸载否则会出现事件重复触发的问题
      events:[]
    }
  },
}
</script>
父级组件调用

父级组件调用时 需要注意的就是异步 问题 因为我用的是antd vue pro 的模板二次开发 ,STable 加载表格数据的方式就是一个异步 操作 子组件已经加载 单数据还没有赋值上去.

 // 所以 如果是异步的情况下我们需要注意一点 就是调用子组件的是 v-if 数据是否存在 这样当数据存在的时候我们在加载组件 就解决了这个问题。
 	import TgCharts from '@/components/Charts/Gantt.vue'
   <tg-charts v-if="tasks.data!=null" :tasks="tasks" />

学习总结 其实在大部分使用方式上还是要相信官方文档 前期把一些时间浪费在散的知识上 ,看了官方文档和自己的理解一整合很快就学会了。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当涉及到 Vue DHTMLX-Gantt 导出甘特图到 Excel 的详细教程时,以下是一步一步的指南: 1. 确保您的项目中已经安装了 VueDHTMLX-Gantt。如果尚未安装,请使用以下命令进行安装: ```bash npm install vue dhtmlx-gantt ``` 2. 在您的 Vue 组件中引入所需的库和样式: ```javascript import 'dhtmlx-gantt'; import 'dhtmlx-gantt/codebase/dhtmlxgantt.css'; import * as XLSX from 'xlsx'; import FileSaver from 'file-saver'; ``` 3. 创建一个 Vue 组件,并在模板中添加一个 Gantt 图表和一个按钮: ```html <template> <div ref="ganttContainer" style="width: 100%; height: 600px;"></div> <button @click="exportGantt">导出 Excel</button> </template> <script> export default { mounted() { const ganttContainer = this.$refs.ganttContainer; gantt.init(ganttContainer); // 设置 Gantt 图表的配置和数据 // 示例数据 const tasks = [ { id: 1, text: '任务1', start_date: '2022-01-01', duration: 5, progress: 0.5 }, { id: 2, text: '任务2', start_date: '2022-01-06', duration: 4, progress: 0.2 }, // 其他任务... ]; gantt.parse({ data: tasks }); }, methods: { exportGantt() { const gantt = this.$refs.ganttContainer.$gantt; const data = gantt.serialize(); const worksheet = XLSX.utils.json_to_sheet(data); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, 'Gantt Data'); const excelBuffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' }); const excelData = new Blob([excelBuffer], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }); FileSaver.saveAs(excelData, 'gantt_data.xlsx'); }, }, }; </script> <style> /* 可选的样式 */ </style> ``` 4. 在上述示例代码中,需要注意以下部分: - 在 `mounted` 钩子中,使用 `gantt.init(ganttContainer)` 初始化 Gantt 图表,并根据您的需求设置其配置和数据。 - `exportGantt` 方法用于将 Gantt 图表数据导出到 Excel。确保在 `exportGantt` 方法中的 `this.$refs.ganttContainer.$gantt` 是对 Gantt 图表组件的正确引用。 - 点击 "导出 Excel" 按钮时,将会生成一个名为 `gantt_data.xlsx` 的 Excel 文件,其中包含了 Gantt 图表的数据。 这就是使用 Vue DHTMLX-Gantt 导出甘特图到 Excel 的详细教程。希望对您有所帮助!如果您有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值