当前位置:首页 > React

react实现动态图表

2026-01-27 14:03:20React

使用 Recharts 实现动态图表

Recharts 是一个基于 React 和 D3.js 的图表库,适合快速实现动态图表。安装依赖后,可以直接使用其组件。

安装 Recharts:

npm install recharts

示例代码:

import React, { useState, useEffect } from 'react';
import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, Legend } from 'recharts';

const DynamicChart = () => {
  const [data, setData] = useState([]);

  useEffect(() => {
    const interval = setInterval(() => {
      const newDataPoint = {
        name: new Date().toLocaleTimeString(),
        value: Math.floor(Math.random() * 100)
      };
      setData(prevData => [...prevData.slice(-9), newDataPoint]); // 保留最后10个数据点
    }, 1000);

    return () => clearInterval(interval);
  }, []);

  return (
    <LineChart width={500} height={300} data={data}>
      <CartesianGrid strokeDasharray="3 3" />
      <XAxis dataKey="name" />
      <YAxis />
      <Tooltip />
      <Legend />
      <Line type="monotone" dataKey="value" stroke="#8884d8" />
    </LineChart>
  );
};

export default DynamicChart;

使用 Chart.js 与 react-chartjs-2

Chart.js 是另一个流行的图表库,通过 react-chartjs-2 可以更方便地在 React 中使用。

安装依赖:

npm install chart.js react-chartjs-2

示例代码:

import React, { useState, useEffect } from 'react';
import { Line } from 'react-chartjs-2';
import { Chart, registerables } from 'chart.js';
Chart.register(...registerables);

const DynamicChart = () => {
  const [chartData, setChartData] = useState({
    labels: [],
    datasets: [{
      label: '动态数据',
      data: [],
      borderColor: 'rgb(75, 192, 192)',
      tension: 0.1
    }]
  });

  useEffect(() => {
    const interval = setInterval(() => {
      const newLabel = new Date().toLocaleTimeString();
      const newValue = Math.floor(Math.random() * 100);

      setChartData(prev => ({
        labels: [...prev.labels.slice(-9), newLabel],
        datasets: [{
          ...prev.datasets[0],
          data: [...prev.datasets[0].data.slice(-9), newValue]
        }]
      }));
    }, 1000);

    return () => clearInterval(interval);
  }, []);

  return <Line data={chartData} />;
};

export default DynamicChart;

使用 D3.js 实现高度定制化图表

D3.js 提供更底层的控制,适合需要高度自定义的场景。

安装 D3:

npm install d3

示例代码:

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

const DynamicD3Chart = () => {
  const svgRef = useRef();
  const [data, setData] = useState([]);

  useEffect(() => {
    const interval = setInterval(() => {
      setData(prev => [...prev.slice(-9), {
        time: new Date(),
        value: Math.random() * 100
      }]);
    }, 1000);
    return () => clearInterval(interval);
  }, []);

  useEffect(() => {
    if (data.length === 0) return;

    const svg = d3.select(svgRef.current);
    const margin = { top: 20, right: 30, bottom: 30, left: 40 };
    const width = 500 - margin.left - margin.right;
    const height = 300 - margin.top - margin.bottom;

    svg.selectAll('*').remove();

    const g = svg.append('g')
      .attr('transform', `translate(${margin.left},${margin.top})`);

    const x = d3.scaleTime()
      .domain(d3.extent(data, d => d.time))
      .range([0, width]);

    const y = d3.scaleLinear()
      .domain([0, 100])
      .range([height, 0]);

    g.append('g')
      .attr('transform', `translate(0,${height})`)
      .call(d3.axisBottom(x));

    g.append('g')
      .call(d3.axisLeft(y));

    const line = d3.line()
      .x(d => x(d.time))
      .y(d => y(d.value));

    g.append('path')
      .datum(data)
      .attr('fill', 'none')
      .attr('stroke', 'steelblue')
      .attr('stroke-width', 1.5)
      .attr('d', line);
  }, [data]);

  return (
    <svg
      ref={svgRef}
      width={500}
      height={300}
    />
  );
};

export default DynamicD3Chart;

性能优化建议

对于高频更新的动态图表,建议限制数据点数量(如只保留最近100个点)。使用 React.memo 或 useMemo 避免不必要的渲染。

const MemoizedChart = React.memo(({ data }) => {
  // 图表渲染逻辑
});

动画方面可以通过 CSS 或库内置的过渡效果实现平滑更新,避免直接操作 DOM。

react实现动态图表

标签: 图表动态
分享给朋友:

相关文章

vue动态组建实现原理

vue动态组建实现原理

Vue 动态组件的实现原理 Vue 的动态组件主要通过 component 标签和 is 属性实现,核心原理涉及组件的动态切换和渲染机制。 动态组件的实现方式 使用 component 标签和 i…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm…

vue 实现动态路由

vue 实现动态路由

动态路由的实现方法 Vue中实现动态路由通常涉及以下关键步骤,结合Vue Router的API和异步加载逻辑完成。 基础配置 安装Vue Router并初始化路由实例。在router/index.j…

vue动态实现select

vue动态实现select

Vue 动态实现 Select 组件 在 Vue 中动态实现 Select 组件可以通过多种方式完成,以下介绍几种常见的方法: 使用 v-for 动态渲染选项 通过 v-for 指令可以动态渲染 s…

vue动态表格实现

vue动态表格实现

Vue动态表格实现方法 使用v-for指令渲染动态数据 通过v-for指令可以循环遍历数组数据生成表格行,数据变化时表格自动更新。示例代码: <template> <tabl…

vue实现动态弧线

vue实现动态弧线

Vue 实现动态弧线的方法 动态弧线可以通过 SVG 或 Canvas 实现,以下是两种常见的方法: 使用 SVG 实现动态弧线 SVG 的 <path> 元素可以绘制弧线,结合 Vu…