Heim > Web-Frontend > js-Tutorial > Hauptteil

Erstellen Sie Ihr eigenes interaktives Liniendiagramm in ReactJS

Patricia Arquette
Freigeben: 2024-10-31 18:14:30
Original
537 Leute haben es durchsucht

Building your own Interactive Line Graph in ReactJS

Grundlegende SVG-Komponente

Erstellen wir zunächst eine einfache SVG-Komponente, die Breite und Höhe als Requisiten akzeptiert. Dies wird der Ausgangspunkt für unsere Grafik sein.

import React from "react";

const LineGraph = ({ height, width }) => {
  return <svg height={height} width={width}></svg>;
};

export default LineGraph;
Nach dem Login kopieren

Hinzufügen der X-Achse

Jetzt fügen wir die X-Achse hinzu, die horizontal über das Diagramm verläuft. Wir verwenden die Element dafür.

const drawXAxis = () => {
  const middleY = height / 2;

  return (
    <line x1={0} y1={middleY} x2={width} y2={middleY} stroke={lineColor} />
  );
};
Nach dem Login kopieren

Hinzufügen der Y-Achse

Wir verwenden eine andere Element zum Zeichnen der Y-Achse, die vertikal durch die Mitte des Diagramms verläuft.

const drawYAxis = () => {
  const middleX = width / 2;

  return (
    <line x1={middleX} y1={0} x2={middleX} y2={height} stroke={lineColor} />
  );
};
Nach dem Login kopieren

Koordinaten als Linienpfad darstellen

Der wichtigste Teil eines Liniendiagramms ist die Linie, die verschiedene Punkte verbindet. Lassen Sie uns einige Beispielkoordinaten zeichnen und sie mithilfe einer SVG-Datei verbinden.

const drawPath = () => {
    const pathData = coordinates
      .map((coordinate, index) =>
        index === 0
          ? `M ${coordinate.x} ${coordinate.y}`
          : `L ${coordinate.x} ${coordinate.y}`
      )
      .join(" ");

    return <path d={pathData} stroke={pathColor} fill="none" />;
  };

Nach dem Login kopieren

Option zum Füllen des Bereichs unterhalb der Linie

Wir können den Bereich unter der Linie mit einer Farbe füllen, um das Diagramm zu verbessern. Dies kann über ein zusätzliches Element erfolgen. Erwägen Sie die Verwendung von isFillArea, um diesen Bereich anzuzeigen/auszublenden.

const drawPath = () => {
  const pathData = coordinates
    .map((coordinate, index) =>
      index === 0
        ? `M ${coordinate.x} ${coordinate.y}`
        : `L ${coordinate.x} ${coordinate.y}`
    )
    .join(" ");

  const middleY = height / 2;
  const svgPath = showFillArea
    ? `${pathData} L ${width} ${middleY} L 0 ${middleY} Z`
    : pathData;
  const fillColor = showFillArea ? areaColor : "none";
  return (
    <path d={svgPath} fill={fillColor} stroke={pathColor} opacity="0.5" />
  );
};
Nach dem Login kopieren

Den Cursor verfolgen

Fügen wir einen Kreis hinzu, der der Bewegung des Cursors über den Diagrammpfad folgt.

Wir benötigen eine Referenz unserer SVG-Komponente, um auf den Begrenzungsrahmen des SVG-Elements zuzugreifen. Außerdem eine Referenz für unseren Tracking-Kreis, der zum Verfolgen des Cursors über dem Diagramm verwendet wird.

const svgRef = useRef();
const circleRef = useRef();
// ...
const drawTrackingCircle = () => {
  return (
    <circle
      ref={circleRef}
      r={6}
      fill="red"
      style={{ display: "none" }} // Initially hidden
    />
  );
};
// ...
<svg ref={svgRef} width={width} height={height}>
// ...
</svg>
Nach dem Login kopieren

Dann müssen wir unserem SVG-Element einen Ereignis-Listener hinzufügen. Dadurch werden alle unsere Cursorbewegungen über dem Diagramm abgehört.

useEffect(() => {
  const svgElement = svgRef.current;
  svgElement.addEventListener("mousemove", handleMouseMove);

  // clean up
  return () => svgElement.removeEventListener("mousemove", handleMouseMove);
}, []);
Nach dem Login kopieren

Als nächstes benötigen wir eine Methode, um die Schnittkoordinate zwischen der Cursorposition und dem Pfad zu finden.

const getIntersectionPoint = (cursorX) => {
  // Find the segment (p1, p2) where cursorX lies between two consecutive coordinates.
  const segment = coordinates.find((p1, i) => {
    // Get the next point
    const p2 = coordinates[i + 1]; 
    // Check if cursorX falls between the two coordinates horizontally.
    return (
      p2 &&
      ((p1.x <= cursorX && p2.x >= cursorX) ||
        (p1.x >= cursorX && p2.x <= cursorX))
    );
  });

  // Return null if no valid segment is found.
  if (!segment) return null; 

  // Destructure the two coordinates in the segment.
  const [p1, p2] = [segment, coordinates[coordinates.indexOf(segment) + 1]];

  // Calculate 't' to determine the relative position between p1 and p2.
  const t = (cursorX - p1.x) / (p2.x - p1.x);

  // Interpolate the Y-coordinate using 't'.
  const y = p1.y + t * (p2.y - p1.y);

  return { x: cursorX, y };
};
Nach dem Login kopieren

Cursorbewegungs-Tracker-Methode. Es verwendet die Methode getIntersectionPoint, um die aktuelle Schnittpunktkoordinate zu ermitteln.

const handleMouseMove = (event) => {
  // Get SVG position
  const svgRect = svgRef.current.getBoundingClientRect();
  // Calculate cursor's X within the SVG
  const cursorX = event.clientX - svgRect.left;

  // Find the intersection point
  const intersectionPoint = getIntersectionPoint(cursorX);
  if (intersectionPoint) {
    // Move the intersection circle to the calculated point
    circleRef.current.setAttribute("cx", intersectionPoint.x);
    circleRef.current.setAttribute("cy", intersectionPoint.y);
    circleRef.current.style.display = "block";
  }
};
Nach dem Login kopieren

Schließlich wäre dies die Struktur unserer Diagrammkomponente

return (
  <svg ref={svgRef} height={height} width={width}>
    {drawPath()}
    {drawXAxis()}
    {drawYAxis()}
    {drawTrackingCircle()}
    {drawDataPointCircles()}
  </svg>
);
Nach dem Login kopieren

So können wir unsere Graph-Komponente verwenden

<LineGraph
  width={300}
  height={400}
  coordinates={samplePoints}
  lineColor="#000"
  pathColor="#00008B"
  areaColor="#ADD8E6"
  dataPointColor="#008000"
  showFillArea
  showDataPointCircle
/>
Nach dem Login kopieren

Codesandbox-Link für die LineGraph-Demo

Blogfoto von Isaac Smith auf Unsplash

Danke fürs Lesen ❤

Das obige ist der detaillierte Inhalt vonErstellen Sie Ihr eigenes interaktives Liniendiagramm in ReactJS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!