Το Visx είναι μια βιβλιοθήκη που μας επιτρέπει να προσθέτουμε εύκολα γραφικά στην εφαρμογή React.

Σε αυτό το άρθρο, θα εξετάσουμε πώς να το χρησιμοποιήσετε για να προσθέσετε καμπύλες με τμήματα που έχουν το δικό τους στυλ στην εφαρμογή μας React

Εγκαταστήστε τα απαιτούμενα πακέτα

Πρέπει να εγκαταστήσουμε μερικές μονάδες για να δημιουργήσουμε το drag and drop.

Για να ξεκινήσουμε, τρέχουμε:

npm i @visx/drag @visx/gradient @visx/responsive @visx/scale

για να εγκαταστήσετε τα πακέτα.

Προσθήκη δυνατότητας μεταφοράς και απόθεσης

Προσθέτουμε drag and drop γράφοντας τον παρακάτω κώδικα:

import React, { useMemo, useState, useEffect } from "react";
import { scaleOrdinal } from "@visx/scale";
import { LinearGradient } from "@visx/gradient";
import { Drag, raise } from "@visx/drag";
const colors = [
  "#025aac",
  "#02cff9",
  "#02efff",
  "#03aeed",
  "#0384d7",
  "#edfdff",
  "#ab31ff",
  "#5924d7"
];
const generateCircles = ({ width, height }) =>
  new Array(width < 360 ? 40 : 185).fill(1).map((d, i) => {
    const radius = 25 - Math.random() * 20;
    return {
      id: `${i}`,
      radius,
      x: Math.round(Math.random() * (width - radius * 2) + radius),
      y: Math.round(Math.random() * (height - radius * 2) + radius)
    };
  });
function Example({ width, height }) {
  const [draggingItems, setDraggingItems] = useState([]);
  useEffect(() => {
    if (width > 10 && height > 10)
      setDraggingItems(generateCircles({ width, height }));
  }, [width, height]);
  const colorScale = useMemo(
    () =>
      scaleOrdinal({
        range: colors,
        domain: draggingItems.map((d) => d.id)
      }),
    [width, height]
  );
  if (draggingItems.length === 0 || width < 10) return null;
  return (
    <div className="Drag" style={{ touchAction: "none" }}>
      <svg width={width} height={height}>
        <LinearGradient id="stroke" from="#ff00a5" to="#ffc500" />
        <rect fill="#c4c3cb" width={width} height={height} rx={14} />
{draggingItems.map((d, i) => (
          <Drag
            key={`drag-${d.id}`}
            width={width}
            height={height}
            x={d.x}
            y={d.y}
            onDragStart={() => {
              setDraggingItems(raise(draggingItems, i));
            }}
          >
            {({ dragStart, dragEnd, dragMove, isDragging, x, y, dx, dy }) => (
              <circle
                key={`dot-${d.id}`}
                cx={x}
                cy={y}
                r={isDragging ? d.radius + 4 : d.radius}
                fill={isDragging ? "url(#stroke)" : colorScale(d.id)}
                transform={`translate(${dx}, ${dy})`}
                fillOpacity={0.9}
                stroke={isDragging ? "white" : "transparent"}
                strokeWidth={2}
                onMouseMove={dragMove}
                onMouseUp={dragEnd}
                onMouseDown={dragStart}
                onTouchStart={dragStart}
                onTouchMove={dragMove}
                onTouchEnd={dragEnd}
              />
            )}
          </Drag>
        ))}
      </svg>
      <style jsx>{`
        .Drag {
          display: flex;
          flex-direction: column;
          user-select: none;
        }
        svg {
          margin: 1rem 0;
        }
        .deets {
          display: flex;
          flex-direction: row;
          font-size: 12px;
        }
        .deets > div {
          margin: 0.25rem;
        }
      `}</style>
    </div>
  );
}
export default function App() {
  return (
    <div className="App">
      <Example width={500} height={300} />
    </div>
  );
}

Έχουμε τη συνάρτηση generateCircles για να επιστρέψουμε έναν πίνακα αντικειμένων με ιδιότητες id , radius και x και y.

Το id είναι το μοναδικό αναγνωριστικό για κάθε κύκλο.

Και οι άλλες ιδιότητες χρησιμοποιούνται για την απόδοση κύκλων στη σελίδα.

Στο στοιχείο Example, παρακολουθούμε τα στοιχεία που παρακολουθούνται με την κατάσταση draggingItems.

Παρακολουθούμε το πλάτος και το ύψος και προσθέτουμε τους κύκλους στην επιστροφή κλήσης useEffect.

Η κατάσταση colorScale μας επιτρέπει να υπολογίσουμε την κλίμακα για τα χρώματα σύμφωνα με τον πίνακα colors που δημιουργήσαμε νωρίτερα.

Στη δήλωση return, έχουμε το στοιχείο Drag, το οποίο είναι το κοντέινερ για τη διατήρηση στοιχείων με δυνατότητα μεταφοράς.

Στη συνέχεια, αποδίδουμε τα στοιχεία με δυνατότητα μεταφοράς με το στήριγμα απόδοσης στο στοιχείο Drag.

Αποδίδει το circles στον πίνακα draggingItems.

Περνάμε τους χειριστές συμβάντων μεταφοράς από την παράμετρο αντικειμένου ως στηρίγματα του circle για να τους κάνουμε σύρσιμο.

Οι θέσεις τους θα ενημερωθούν με αυτές τις λειτουργίες χειριστή συμβάντων.

Τέλος, έχουμε τα στυλ στην ετικέτα style για να αλλάξουμε τα στυλ για το κοντέινερ.

Τώρα θα πρέπει να έχουμε κύκλους στην οθόνη που μπορούν να σύρονται γύρω από το πλαίσιο.

συμπέρασμα

Μπορούμε να προσθέσουμε δυνατότητες μεταφοράς και απόθεσης στην εφαρμογή React με τη βιβλιοθήκη Visx.

Σας άρεσε αυτό το άρθρο; Αν ναι, αποκτήστε περισσότερο παρόμοιο περιεχόμενο εγγραφείτε στο κανάλι μας στο YouTube!

Περισσότερο περιεχόμενο στο plainenglish.io