当前位置:首页 > 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 的步骤 理解基础概念 React 是一个用于构建用户界面的 JavaScript 库。学习 React 之前,建议掌握 JavaScript 的基础知识,包括 ES6+ 语法(如箭头…

react性能如何

react性能如何

React 性能特点 React 通过虚拟 DOM(Virtual DOM)和高效的 diff 算法优化性能。虚拟 DOM 减少了直接操作真实 DOM 的开销,仅在必要时更新变化的部分。React 的…

如何关闭react

如何关闭react

关闭React应用的步骤 在开发或运行React应用时,可能需要关闭正在运行的开发服务器或停止应用。以下是几种常见情况的处理方法: 停止开发服务器 如果正在使用npm start或yarn star…

react如何扩展

react如何扩展

扩展 React 项目的常用方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式。通过包裹组件并注入额外属性或逻辑,可以实现功能扩展。例如,一个日志记录的高阶组件: function…

react如何减少伤害

react如何减少伤害

减少 React 应用性能伤害的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行浅比较,避免不必要的重新渲染。类组件可以使用 PureC…

如何调试react源码

如何调试react源码

调试React源码的方法 克隆React源码仓库到本地: git clone https://github.com/facebook/react.git cd react 安装依赖并构建开发版本:…