Ohne weitere Umschweife hier ein Demobild. Die implementierten Funktionen sind: Legende links, Wasserfalldiagramm rechts und Dateninformationen, die den aktuellen Koordinaten entsprechen und beim Bewegen der Maus angezeigt werden (es gibt Raum für Optimierungen, bitte experimentieren Sie ruhig damit). In der Abbildung verwendete Plugins Es wird empfohlen, das npm-Plugin colormap zu installieren WasserfalldiagrammkörperIch werde es hier nicht erklären. Es sind alles native Tags und Vue-gebundene Ereignisse. Sie können sie je nach tatsächlicher Projektsituation in Komponenten kapseln. Ich habe sie hier zusammengeschrieben. <Vorlage> <div> <div Klasse="Inhalt"> <div Klasse="neirong"> <!--Legende--> <div Klasse="Legende"> <canvas ref="legend"></canvas> </div> <!--Wasserfalldiagramm--> <div Klasse="Wasserfall" ref="Wasserfall-Inhalt" @mousemove="WasserFallBewegung($event)" @mouseleave="WasserFallLeave" > <canvas ref="Wasserfall"></canvas> <!--Bewegen Sie die Maus in das Popup-Fenster--> <div ref="Tipp" class="Tipp"></div> </div> </div> </div> </div> </Vorlage> Hier sind die verwendeten Daten
<Skript> Standard exportieren { Name: "Index", Daten() { zurückkehren { Farbkarte: [], Legende: null, Wasserfall: null, WasserfallListe: [], WasserfallIndex: 0, WasserfallKopyliste: [], WasserfallIntervalle: null, Wasserfallbreite: 0, Wasserfallhöhe: 0, maxNum: 10, minNum: 0 } }, Das Folgende ist eine spezifische Methode. Sie ist grob geschrieben. Bitte lesen Sie sie sorgfältig durch. Wenn Sie sie nützlich finden, nehmen Sie sie bitte mit. Wenn es Mängel gibt, können Sie sie frei ändern. Ich werde den Methodenaufruf hier nicht erklären, da das Verlassen der Seite den Timer zerstört. montiert() { sei dx = dies dx.setColormap() dx.createLegendCanvas() dx.queryChartList() }, zerstört() { sei dx = dies Intervall löschen(dx.WasserfallIntervalle) }, Erstellen Sie eine Farbbibliothek Weitere Einzelheiten finden Sie auf der offiziellen Website des oben genannten Plug-Ins mit einer ausführlichen Einführung. setzeFarbkarte() { sei dx = dies lass Farbkarte = erfordern('Farbkarte') dx.colormap = Farbkarte({ Farbkarte: 'Jet', Anzahl der Farbtöne: 150, Format: 'rba', Alpha: 1, }) }, Eine Legende erschaffenerstelleLegendCanvas() { sei dx = dies let legendRefs = dx.$refs.legend dx.legend = legendRefs.getContext('2d') let legendCanvas = document.createElement('canvas') legendCanvas.width = 1 let legendCanvasTemporary = legendCanvas.getContext('2d') const imageData = legendCanvasTemporary.createImageData(1, dx.colormap.length) für (lass i = 0; i < dx.colormap.length; i++) { const Farbe = dx.colormap[i] imageData.data[imageData.data.length - i * 4 + 0] = Farbe[0] imageData.data[imageData.data.length - i * 4 + 1] = Farbe[1] imageData.data[imageData.data.length - i * 4 + 2] = Farbe[2] imageData.data[imageData.data.length - i * 4 + 3] = 255 } legendCanvasTemporary.putImageData(imageData, 0, 0) dx.legend.drawImage(legendCanvasTemporary.canvas, 0, 0, 1, dx.colormap.Länge, 50, 0, 200, dx.legend.canvas.Höhe) }, Erstellen eines WasserfalldiagrammserstelleWasserfallLeinwand() { sei dx = dies lass Wasserfall = dx.$refs.waterFall dx.waterFall = waterFall.getContext('2d') Wasserfall.Breite = dx.WasserfallBreite Wasserfall.Höhe = dx.$refs.waterFallContent.offsetHeight }, Zeichnen Sie ein einzeiliges BildrowToImageData(Daten) { sei dx = dies wenn (dx.$refs.waterFallContent !== undefiniert) { lass canvasHeight = Math.floor(dx.$refs.waterFallContent.offsetHeight / dx.waterFallHeight) let imgOld = dx.waterFall.getImageData(0, 0, dx.waterFallWidth, canvasHeight * dx.waterFallIndex + 1) const imageData = dx.waterFall.createImageData(data.length, 1) für (sei i = 0; i < imageData.data.length; i += 4) { const cindex = dx.colorMapData(Daten[i / 4], 0, 130) const Farbe = dx.colormap[cindex] Bilddaten.Daten[i + 0] = Farbe[0] Bilddaten.Daten[i + 1] = Farbe[1] Bilddaten.Daten[i + 2] = Farbe[2] Bilddaten.Daten[i + 3] = 255 } für (lass i = 0; i < Leinwandhöhe; i++) { dx.waterFall.putImageData(Bilddaten, 0, i) } dx.waterFall.putImageData(altesBild, 0, Leinwandhöhe) } }, Gibt die Colormap-Farbe zurück, die den Daten entsprichtcolorMapData(Daten, OutMin, OutMax) { sei dx = dies wenn (Daten <= dx.minNum) { Rückkehr outMin } sonst wenn (Daten >= dx.maxNum) { RückgabewertMax } returniere Math.round(((Daten - dx.minNum) / (dx.maxNum - dx.minNum)) * outMax) }, Bewegen Sie die Maus in das WasserfalldiagrammWasserfallBewegung(Ereignis) { sei dx = dies let dataWidth = (dx.$refs.waterFallContent.offsetWidth / dx.waterFallWidth).toFixed(2) let dataHeight = (dx.$refs.waterFallContent.offsetHeight / dx.waterFallHeight).toFixed(2) let x = Math.floor(event.offsetX / dataWidth) lass y = Math.floor(event.offsetY / dataHeight) versuchen { dx.$refs.tip.innerHTML = 'Wert:' + JSON.parse(JSON.stringify(dx.waterFallCopyList[y][x])) sei xx = event.offsetX + 5 sei yy = event.offsetY - 20 wenn (Ereignis.OffsetX > 1300) { xx = Ereignis.OffsetX - 160 yy = Ereignis.OffsetY - 20 } dx.$refs.tip.style.position = "absolut" dx.$refs.tip.style.left = xx + 'px' dx.$refs.tip.style.top = yy + 'px' dx.$refs.tip.style.display = "Block" } fangen (e) { dx.$refs.tip.style.display = "keine" } }, Bewegen Sie die Maus aus dem WasserfalldiagrammWasserfallHinterlassen() { sei dx = dies dx.$refs.tip.style.display = "keine" }, Wasserfalldiagramm - Simulation gefälschter DatenqueryChartList() { sei dx = dies dx.waterFallWidth = 1500 dx.waterFallHeight = 30 lass Daten = [] für (sei i = 0; i < 1500; i++) { Daten.push(Math.floor(Math.random() * (20 - 1)) + 1) } wenn (dx.waterFall === null) { dx.createWaterFallCanvas(Daten.Länge) } dx.rowToImageData(Daten) dx.waterFallCopyList.unshift(Daten) dx.waterFallIndex++ wenn (dx.waterFallIndex > dx.waterFallHeight) { dx.waterFallCopyList.pop() } dx.waterFallIntervals = setTimeout(() => { dx.queryChartList() }, 1000) }, Stilcode .neirong { Breite: 1800px; Höhe: 100%; Rand: 80px automatisch; Anzeige: Flex; Inhalt ausrichten: zentriert; } .legende { Breite: 25px; Höhe: 500px; } Leinwand { Breite: 100 %; Höhe: 100%; } .Wasserfall { Breite: 1500px; Höhe: 500px; Position: relativ; } .Tipp { Zeigerereignisse: keine; Anzeige: keine; Hintergrundfarbe: #0404049e; Rahmenradius: 10px; Farbe: #fff; Polsterung: 10px; Box-Größe: Rahmenbox; } An diesem Punkt kann die Demo grundsätzlich ohne Fehler ausgeführt werden. Der Code ist nicht sehr fortgeschritten. Ich bin auch ein Anfänger und schreibe zum ersten Mal einen Artikel. Ich hoffe, die Großen können mir bessere Vorschläge machen und ich werde fleißig lernen. Ich hoffe auch, dass Freunde, die auf ähnliche Anforderungen stoßen und keine Ideen haben, aus meiner Erfahrung mit dem Betreten der Grube lernen und schneller wachsen können. Dies ist das Ende dieses Artikels darüber, wie Vue+Canvas eine Echtzeit-Datenaktualisierung von oben nach unten mit einem Wasserfalldiagrammeffekt erreicht (ähnlich wie QT). Weitere verwandte Inhalte zu Vue+Canvas Echtzeit-Aktualisierungs-Wasserfalldiagrammen finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
>>: Ein Beispiel für die schnelle Bereitstellung von Webanwendungen mit Tomcat in Docker
1. MySQL-Datenbank installieren ① Herunterladen, ...
Der spezifische Code lautet wie folgt: Paket epoi...
Tar-Backup-System sudo tar cvpzf backup.tgz --exc...
Inhaltsverzeichnis 1. Eingebaute Objekte 2. Mathe...
1. Verwenden Sie xshell, um eine Verbindung mit d...
Tipps: Die Methode zur Array-Änderung führt zur A...
Wie lade ich MySQL von der offiziellen Website he...
Inhaltsverzeichnis Einführung Wirkung Prinzip bil...
Übersicht über die Clusterbereitstellung 172.22.1...
Die Fähigkeiten, die Front-End-Entwickler beherrs...
Awk ist ein leistungsfähiges Tool, das einige Auf...
Manchmal müssen wir den Hyperlink <a> anstel...
In diesem Artikelbeispiel wird der spezifische Co...
Ich habe im ersten Halbjahr des letzten Jahres an...
Titel: Vue verwendet Vue-Meta-Info, um den Titel ...