Beispiel für die Implementierung eines kreisförmigen Fortschrittsbalkens in Vue

Beispiel für die Implementierung eines kreisförmigen Fortschrittsbalkens in Vue

Die Anzeige von Daten ist seit jeher eine Forderung, die in allen Lebensbereichen besteht. Insbesondere in der Front-End-Entwicklungsbranche werden Daten in einer Vielzahl von Diagrammen und Tabellen angezeigt, was äußerst ärgerlich (zu kompliziert) ist!
Vor ein paar Tagen habe ich gerade grafische Datenanzeigeeffekte wie Liniendiagramme, Balkendiagramme und Kreisdiagramme erstellt. Heute bin ich auf einen Anzeigeeffekt gestoßen, der einem kreisförmigen Fortschrittsbalken ähnelt. Ich beschäftige mich täglich mit Daten und Schnittstellen. Ich habe viele Projekte gemacht, bin aber immer noch ein Anfänger. Es sind alles Tränen!
Um es ganz klar zu sagen, ich kenne mich mit Canvas und CSS3 nicht aus, deshalb habe ich ein fertiges Rad gefunden:

<Vorlage>
 <div Klasse="Inhalt" ref="Box">
 <svg style="transform: drehen(-90°)" :width="Breite" :height="Breite" xmlns="http://www.w3.org/2000/svg">
  <Kreis :r="(Breite-Radius)/2"
  :cy="Breite/2"
  :cx="Breite/2"
  :Strichbreite="Radius"
  :Strich="Hintergrundfarbe"
  füllen="keine"
  />
  <Kreis ref="$bar"
  :r="(Breite-Radius)/2"
  :cy="Breite/2"
  :cx="Breite/2"
  :Strich="Balkenfarbe"
  :Strichbreite="Radius"
  :stroke-linecap="istRund ? 'rund' : 'quadratisch'"
  :stroke-dasharray="(Breite-Radius)*3,14"
  :stroke-dashoffset="isAnimation ? (Breite-Radius) * 3,14 : (Breite - Radius) * 3,14 * (100 - Fortschritt) / 100"
  füllen="keine"
  />
 </svg>
 <div Klasse="center_text" :style="{Farbe, Schriftgröße}">
  <p v-if="!$slots.default" class="title">{{Fortschritt}}%</p>
  <Steckplatz></Steckplatz>
 </div>
 </div>
</Vorlage>

<Skript>
Standard exportieren {
 Requisiten: {
 Radius:
  Typ: [Zahl, Zeichenfolge],
  Standard: 20
 }, // Dicke des Fortschrittsbalkens progress: {
  Typ: [Zahl, Zeichenfolge],
  Standard: 20
 }, // Fortschrittsbalken in Prozent barColor: {
  Typ: Zeichenfolge,
  Standard: "#1890ff"
 }, // Farbe des Fortschrittsbalkens backgroundColor: {
  Typ: Zeichenfolge,
  Standard: "rgba(0,0,0,0.3)"
 }, // Hintergrundfarbe isAnimation: {
  // Ist es ein Animationseffekttyp: Boolean,
  Standard: true
 },
 istRunde: {
  // Ist es ein Rundpinsel Typ: Boolean,
  Standard: true
 },
 Ausweis: {
  // Komponenten-ID, wird verwendet, wenn mehrere Komponenten nebeneinander existieren. Typ: [String, Number],
  Standard: 1
 },
 Dauer: {
  // Die gesamte Animationsdauer Typ: [String, Number],
  Standard: 1000
 },
 Verzögerung:
  // Wie lange soll die Ausführung verzögert werden? Typ: [String, Number],
  Standard: 200
 },
 Zeitfunktion: {
  // Animation-Easing-Funktionstyp: String,
  Standard: „cubic-bezier(0.99, 0.01, 0.22, 0.94)“
 },
 Kreisbreite: {
  //Ringbreitentyp: Zahl,
  Standard: 100,
 },
 Farbe:
  //Textfarbtyp: String,
  Standard: „#000“
 },
 Schriftgröße: {
  //Textgrößentyp: String,
  Standard: „18px“
 }
 },
 Daten() {
 zurückkehren {
  Breite: diese.Kreisbreite,
  idStr: `circle_progress_keyframes_${this.id}`
 };
 },
 vorZerstören() {
 // Lösche das Style-Tag der alten Komponente document.getElementById(this.idStr) &&
 document.getElementById(this.idStr).remove();
 window.addEventListener(() => {});
 },
 montiert() {
 lass self = dies;
 this.setCircleWidth();
 dies.setAnimation();
 // window.onresize kann hier nicht verwendet werden
 Fenster.addEventListener(
  "Größe ändern",
  Entprellung(Funktion() {
  self.setCircleWidth();
  selbst. setAnimation(selbst);
  }, 300)
 );
 },
 Methoden: {
 setzeKreisbreite() {
  lass box = diese.$refs.box;
  let width = box.clientWidth;
  lass Höhe = Box.ClientHeight;
  sei cW = Breite > Höhe? Höhe : Breite;
  diese.Breite = cW;
 },
 setAnimation() {
  lass self = dies;
  wenn (self.isAnimation) {
  // Wiederholen Sie die Definition if (document.getElementById(self.idStr)) {
   console.warn("vue-circle-progress sollte nicht denselben ID-Stil haben");
   document.getElementById(self.idStr).remove();
  }
  // Datei mit Animationsstil generieren let style = document.createElement("style");
  Stil.id = self.idStr;
  Stil.Typ = "Text/CSS";
  style.innerHTML = `
  @keyframes Kreis_Fortschritt_keyframes_name_${self.id} {
  von {stroke-dashoffset: ${(self.width - self.radius) * 3.14}px;}
  zu {stroke-dashoffset: ${((self.width - self.radius) *
  3,14 *
  (100 - eigener Fortschritt)) /
  100}px;}}
  .circle_progress_bar${
  selbst.id
  } {Animation: Kreis_Fortschritt_Keyframes_Name_${self.id} ${
   selbst.dauer
  }ms ${self.delay}ms ${self.timeFunction} vorwärts;}`;
  // Eine neue Stildatei hinzufügen document.getElementsByTagName("head")[0].appendChild(style);
  // Animationsklasse zum SVG-Element hinzufügen
  self.$refs.$bar.classList.add(`circle_progress_bar${self.id}`);
  }
 }
 }
};
</Skript>
<Stilbereich>
.Inhalt {Höhe: 100 %; Anzeige: Flex; Inhalt ausrichten: Mitte; Elemente ausrichten: Mitte;}
.center_text {position:absolut;}
</Stil>

Anwendung:

<CircleProgress :id="'circle1'" :circleWidth="40" :radius="7" :progress="30" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#FF4F4F'" />
<CircleProgress :id="'circle2'" :circleWidth="40" :radius="7" :progress="50" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#FF902A'" />
<CircleProgress :id="'circle3'" :circleWidth="40" :radius="7" :progress="89" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#FFDB4F'" />
<CircleProgress :id="'circle4'" :circleWidth="40" :radius="7" :progress="25" :isAnimation="true" :backgroundColor="'#E9E9E9'" :barColor="'#B8D87E'" />

Bitte beachten Sie: Wenn Sie mehr als zwei solcher kreisförmigen Fortschrittsbalken gleichzeitig auf Ihrer Seite verwenden, müssen Sie für jeden kreisförmigen Fortschrittsbalken eine andere ID festlegen. Andernfalls sind die letztendlich von allen Kreisen angezeigten Daten die Daten des letzten Kreises.

Der Code enthält eine Anti-Shake-Funktion. Hier ist die Funktion:

Funktion Entprellung(func, wait, immediately) {
 let timeout, args, context, timestamp, result

 const später = Funktion () {
 // Entsprechend dem letzten Trigger-Zeitintervall const last = +new Date() - Zeitstempel

 // Das letzte Mal, als die gewrappte Funktion aufgerufen wurde, ist das Zeitintervall last kürzer als das eingestellte Zeitintervall wait
 wenn (letzter < warten && letzter > 0) {
  Timeout = setTimeout(später, warten - zuletzt)
 } anders {
  Timeout = null
  // Wenn auf immediate===true gesetzt, muss es hier nicht aufgerufen werden, weil die Startgrenze bereits aufgerufen wurde if (!immediate) {
  Ergebnis = func.apply(Kontext, Argumente)
  wenn (!timeout) Kontext = Argumente = null
  }
 }
 }

Dieser Artikel bezieht sich auf ein kreisförmiges Fortschrittsbalken-Plugin vue-circleprogressbar auf npm. Der Grund, warum dieses Plugin nicht direkt im Projekt installiert und verwendet wird, ist, dass es unseren Entwicklungsanforderungen nicht ganz entspricht. Beispielsweise kann dieses Plugin die Breite des Kreises, die Farbe des Textes oder die Größe des Textes nicht festlegen. Ein weiteres Beispiel: Dieses Plugin verlässt sich nur für den Verwacklungsschutz auf lodash (die Größe dieses lodash ist immer noch sehr groß).

Was die Verwendung dieser Komponente in React betrifft, kann sie mit einer geringfügigen Änderung entsprechend dem React-Lebenszyklus, der Syntax von React-Hooks oder der Syntax des DVA-Modus verwendet werden. Es ist sehr einfach und ich werde nicht näher darauf eingehen.

Autor: Xiaohuai

Quelle: http://tnnyang.cnblogs.com

Oben sind die Details des Beispiels der Implementierung eines kreisförmigen Fortschrittsbalkens in Vue aufgeführt. Weitere Informationen zur Implementierung eines kreisförmigen Fortschrittsbalkens in Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Vue implementiert einen dynamischen kreisförmigen prozentualen Fortschrittsbalken
  • Verwenden der Front-End- und Back-End-Interaktion von vue+ElementUI+echarts zum Realisieren dynamischer Donut-Diagramme im Springboot-Projekt (empfohlen)
  • Springboot verwendet die Front-End- und Back-End-Interaktion von Vue + Echarts, um dynamische Donut-Diagramme zu realisieren
  • Implementierung der Funktion der kreisförmigen prozentualen Fortschrittsbalkenkomponente von Vue
  • Vue zeichnet dynamisch den Effekt eines Dreiviertel-Donut-Diagramms
  • Beispielcode für die Verwendung von Echarts zum Erstellen eines Donut-Diagramms in Vue
  • Vue verwendet Canvas, um einen Kreis zu zeichnen

<<:  Einfaches Teilen von Mysql-Backup-BAT-Skripten unter Windows

>>:  Eine vollständige Liste gängiger Linux-Systembefehle für Anfänger

Artikel empfehlen

Mac VMware Fusion CentOS7 Konfiguration statisches IP-Tutorial-Diagramm

Inhaltsverzeichnis Installieren Sie CentOS7 Konfi...

Implementieren Sie über 24 Array-Methoden in JavaScript von Hand

Inhaltsverzeichnis 1. Traversal-Klasse 1. fürJede...

Docker Compose-Installationsmethoden in verschiedenen Umgebungen

1. Online-Installation Derzeit habe ich nur die O...

So installieren Sie MySQL 8.0 und melden sich bei MySQL unter MacOS an

Folgen Sie dem offiziellen Tutorial, laden Sie da...

Implementierung der Nginx-Domänennamenweiterleitung

Einführung in Nginx Nginx („engine x“) ist ein le...

So übertragen Sie Dateien zwischen Docker-Container und lokalem Computer

Zum Übertragen von Dateien zwischen dem Host und ...

Empfehlen Sie 60 Paging-Fälle und bewährte Vorgehensweisen

<br />Struktur und Hierarchie reduzieren die...

Spezifische Methode zum Anzeigen von Benutzerautorisierungsinformationen in MySQL

Spezifische Methode: 1. Öffnen Sie die Eingabeauf...

Detaillierte Analyse der MySQL-Sperrblockierung

Bei der täglichen Wartung werden Threads häufig b...

Lösen Sie das Problem, dass await in forEach nicht funktioniert

1. Einleitung Vor ein paar Tagen bin ich bei der ...

HTML-Tabellen-Tag-Tutorial (45): Tabellen-Body-Tag

Mit dem Tag <tbody> wird der Stil des Tabel...

Beispielcode zur Implementierung des Aushöhlungseffekts mit CSS

Wirkungsprinzip Verwenden Sie hauptsächlich CSS-F...