当前位置:首页 > VUE

vue实现甘特图展示

2026-02-11 09:28:53VUE

使用Vue-Gantt组件库(如vue-gantt-elastic)

安装依赖包:

npm install vue-gantt-elastic

基础实现代码:

<template>
  <gantt-elastic
    :tasks="tasks"
    :options="options"
    @tasks-changed="handleTasksChange"
  ></gantt-elastic>
</template>

<script>
import GanttElastic from 'vue-gantt-elastic';
export default {
  components: { GanttElastic },
  data() {
    return {
      tasks: [
        {
          id: 'task1',
          label: '项目启动',
          start: '2023-01-01',
          end: '2023-01-10',
          progress: 50
        }
      ],
      options: {
        title: {
          label: '项目计划'
        }
      }
    };
  },
  methods: {
    handleTasksChange(updatedTasks) {
      this.tasks = updatedTasks;
    }
  }
};
</script>

基于D3.js自定义实现

通过D3.js的缩放和拖拽功能构建交互式甘特图:

<template>
  <div ref="ganttContainer" class="gantt-chart"></div>
</template>

<script>
import * as d3 from 'd3';
export default {
  mounted() {
    this.renderGantt();
  },
  data() {
    return {
      tasks: [
        { id: 1, name: '需求分析', start: new Date(2023, 0, 1), end: new Date(2023, 0, 5) }
      ]
    };
  },
  methods: {
    renderGantt() {
      const svg = d3.select(this.$refs.ganttContainer)
        .append('svg')
        .attr('width', 800)
        .attr('height', 400);

      // 时间比例尺
      const xScale = d3.scaleTime()
        .domain([new Date(2023, 0, 1), new Date(2023, 0, 31)])
        .range([0, 700]);

      // 绘制任务条
      svg.selectAll('.task')
        .data(this.tasks)
        .enter()
        .append('rect')
        .attr('class', 'task-bar')
        .attr('x', d => xScale(d.start))
        .attr('y', (d, i) => i * 30 + 20)
        .attr('width', d => xScale(d.end) - xScale(d.start))
        .attr('height', 20)
        .attr('fill', '#4CAF50');
    }
  }
};
</script>

集成第三方甘特图库(如Frappe Gantt)

安装Frappe Gantt:

npm install frappe-gantt

Vue封装实现:

<template>
  <div ref="gantt"></div>
</template>

<script>
import Gantt from 'frappe-gantt';
export default {
  mounted() {
    new Gantt(this.$refs.gantt, [
      {
        id: 't1',
        name: '任务1',
        start: '2023-01-01',
        end: '2023-01-05',
        progress: 30
      }
    ], {
      view_mode: 'Week'
    });
  }
};
</script>

响应式数据处理

动态更新甘特图数据示例:

watch: {
  tasks: {
    handler(newTasks) {
      if (this.gantt) {
        this.gantt.refresh(newTasks);
      }
    },
    deep: true
  }
}

样式优化建议

添加CSS增强可视化效果:

.gantt-chart {
  font-family: Arial;
  overflow-x: auto;
}
.task-bar:hover {
  opacity: 0.8;
  stroke: #333;
  stroke-width: 1px;
}

vue实现甘特图展示

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

相关文章

vue实现搜索

vue实现搜索

Vue 实现搜索功能 在 Vue 中实现搜索功能通常涉及数据绑定、事件监听和过滤逻辑。以下是几种常见的实现方式: 使用计算属性过滤列表 <template> <div>…

vue实现点击页面切换

vue实现点击页面切换

实现点击页面切换功能 在Vue中实现点击页面切换功能,可以通过路由跳转或组件动态渲染两种方式完成。以下是具体实现方法: 使用Vue Router实现页面跳转 安装Vue Router后,在项目中配置…

vue 实现权限

vue 实现权限

Vue 实现权限控制的方法 在 Vue 项目中实现权限控制通常涉及前端路由、组件和按钮级别的权限管理。以下是几种常见的实现方式: 路由权限控制 通过路由守卫实现权限验证,过滤用户无权访问的路由:…

vue 实现滚动

vue 实现滚动

实现滚动的基本方法 在Vue中实现滚动效果可以通过多种方式完成,包括使用原生JavaScript、CSS或第三方库。以下是一些常见的方法: 使用window.scrollTo方法实现页面滚动 可以通…

vue实现剪辑

vue实现剪辑

Vue 实现视频剪辑功能 在Vue中实现视频剪辑功能通常需要结合HTML5的<video>元素和第三方库(如FFmpeg.js或Video.js)。以下是几种常见的实现方法: 使用FF…

computed vue 实现

computed vue 实现

computed 在 Vue 中的基本用法 Vue 的 computed 属性用于声明依赖于其他数据的计算属性。当依赖的数据变化时,计算属性会自动重新计算并缓存结果。 export defau…