当前位置:首页 > 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的缩放和拖拽功能构建交互式甘特图:

vue实现甘特图展示

<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封装实现:

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 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…

vue实现标签

vue实现标签

Vue 实现标签的方法 在 Vue 中实现标签功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 动态组件可以根据不同的条件渲染不同的标签内容。通过 :is 属性动态绑定组件名,实现标签…

vue  实现tab

vue 实现tab

实现 Tab 切换功能 在 Vue 中实现 Tab 切换功能可以通过动态组件或条件渲染完成。以下是两种常见方法: 使用 v-if 或 v-show 实现条件渲染 通过绑定 currentTab 变量…

vue实现阻塞

vue实现阻塞

Vue 实现阻塞的方法 在 Vue 中实现阻塞操作通常涉及异步控制、状态管理或生命周期钩子的使用。以下是几种常见方法: 使用 async/await 处理异步阻塞 通过 async/await 可…

自己实现vue

自己实现vue

实现简易版 Vue.js 核心功能 要实现一个简易版 Vue.js,需要理解其核心功能:数据响应式、模板编译、依赖收集和虚拟 DOM。以下分模块实现关键功能。 数据响应式(Reactivity) 通…

vue实现word在线

vue实现word在线

Vue 实现 Word 在线编辑与预览 方案一:使用 docx.js 与前端解析 安装依赖库 docx 和 file-saver,用于生成和下载 Word 文件: npm install docx…