当前位置:首页 > React

react实现甘特图

2026-01-26 14:30:08React

使用 react-gantt-timeline 库

安装依赖库:

npm install react-gantt-timeline

基础实现代码:

import React from 'react';
import { Gantt } from 'react-gantt-timeline';

const tasks = [
  {
    id: 1,
    name: '任务1',
    start: new Date(2023, 0, 1),
    end: new Date(2023, 0, 5)
  },
  {
    id: 2,
    name: '任务2',
    start: new Date(2023, 0, 6),
    end: new Date(2023, 0, 10)
  }
];

function App() {
  return <Gantt tasks={tasks} />;
}

export default App;

使用 react-gantt 库

安装依赖:

npm install react-gantt

基础示例:

react实现甘特图

import React from 'react';
import Gantt from 'react-gantt';

const tasks = [
  { 
    id: 'Task 1',
    name: '开发',
    start: '2023-01-01',
    end: '2023-01-05'
  }
];

function App() {
  return (
    <Gantt
      tasks={tasks}
      viewMode={'week'}
      onTaskChange={task => console.log(task)}
    />
  );
}

自定义实现方案

使用HTML5 Canvas绘制:

import React, { useRef, useEffect } from 'react';

const GanttChart = ({ tasks }) => {
  const canvasRef = useRef(null);

  useEffect(() => {
    const canvas = canvasRef.current;
    const ctx = canvas.getContext('2d');

    // 绘制逻辑
    tasks.forEach((task, index) => {
      const y = index * 30 + 20;
      const width = (task.end - task.start) / (1000 * 60 * 60 * 24) * 10;

      ctx.fillStyle = '#4CAF50';
      ctx.fillRect(task.start, y, width, 20);
      ctx.fillStyle = '#000';
      ctx.fillText(task.name, task.start, y - 5);
    });
  }, [tasks]);

  return <canvas ref={canvasRef} width={800} height={400} />;
};

使用 D3.js 集成方案

安装D3依赖:

npm install d3

React组件实现:

react实现甘特图

import React, { useRef, useEffect } from 'react';
import * as d3 from 'd3';

const D3Gantt = ({ data }) => {
  const ref = useRef();

  useEffect(() => {
    const svg = d3.select(ref.current);
    // D3绘制甘特图逻辑
    svg.selectAll('rect')
      .data(data)
      .enter()
      .append('rect')
      .attr('x', d => xScale(d.start))
      .attr('y', (d,i) => i * 30)
      .attr('width', d => xScale(d.end) - xScale(d.start))
      .attr('height', 20);
  }, [data]);

  return <svg ref={ref} width={800} height={500} />;
};

关键功能实现要点

时间轴处理:

const xScale = d3.scaleTime()
  .domain([new Date(2023, 0, 1), new Date(2023, 1, 1)])
  .range([0, 800]);

任务依赖关系:

const tasks = [
  {
    id: 1,
    dependencies: [2] // 依赖任务ID
  }
];

交互功能实现:

const handleTaskClick = (task) => {
  console.log('Selected task:', task);
};

<GanttComponent 
  tasks={tasks}
  onTaskClick={handleTaskClick}
/>

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

相关文章

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元运…

react moment如何使用

react moment如何使用

安装 react-moment 通过 npm 或 yarn 安装 react-moment: npm install react-moment 或 yarn add react-moment 基本…

甘特图vue实现

甘特图vue实现

甘特图在 Vue 中的实现方法 使用现成库(推荐) 推荐使用 vue-ganttastic 或 dhtmlx-gantt 等现成库快速实现甘特图功能。 安装 vue-ganttastic: npm…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

react如何迭代

react如何迭代

在 React 中迭代数组或对象 React 提供了多种方式来处理数组或对象的迭代,以下是常见的方法: 使用 map 方法迭代数组 map 是 JavaScript 数组的内置方法,常用于在 Rea…

react如何发音

react如何发音

React的发音 React的正确发音为 /riˈækt/,类似于“ree-akt”。以下是详细说明: 发音分解 第一个音节“Ree”发音类似英文单词“see”中的“ee”音。 第二个音节…