Vue + Canvas realisiert den Effekt der Aktualisierung des Wasserfalldiagramms von oben nach unten in Echtzeit (ähnlich wie QT).

Vue + Canvas realisiert den Effekt der Aktualisierung des Wasserfalldiagramms von oben nach unten in Echtzeit (ähnlich wie QT).

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örper

Ich 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

  • Farbkarte: Farbbibliothek
  • Legende: Legende
  • waterFall: Wasserfalldiagramm
  • waterFallList: Quelldaten des Wasserfalldiagramms
  • waterFallIndex: Der vom Wasserfalldiagramm-Timer verwendete Zählindex
  • waterFallCopyList: zweidimensionales Array von Wasserfalldiagrammen (wird zur temporären Speicherung von Anzeigedaten verwendet)
  • waterFallIntervals: Wasserfall-Timer
  • waterFallWidth: Breite des Wasserfalldiagramms (Länge der vom Backend zurückgegebenen Daten)
  • waterFallHeight: Die Höhe des Wasserfalls (kann auch als Anzahl der Renderings verstanden werden, z. B. sind 30 Renderings abgeschlossen)
  • maxNum: Maximalwert der Legende
  • minNum: Minimalwert der Legende
<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 erschaffen

erstelleLegendCanvas() {
                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 Wasserfalldiagramms

 erstelleWasserfallLeinwand() {
                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 Bild

 rowToImageData(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 entspricht

colorMapData(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 Wasserfalldiagramm

            WasserfallBewegung(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 Wasserfalldiagramm

WasserfallHinterlassen() {
                sei dx = dies
                dx.$refs.tip.style.display = "keine"
            },

Wasserfalldiagramm - Simulation gefälschter Daten

queryChartList() {
                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:
  • Detaillierte Erläuterung des Implementierungsprinzips der bidirektionalen Datenbindung von Vue2.0/3.0
  • Analyse des Problems des Datenverlusts durch erzwungene Aktualisierung von Vuex
  • Wie verfolgt Vue Datenänderungen?
  • Lösung für das Vue-Datenzuweisungsproblem
  • Vue setzt die Daten auf ihren ursprünglichen Zustand zurück
  • Analyse und Lösung von Datenverlusten während der Wertübertragung von Vue-Komponenten
  • SpringBoot + Vue realisiert die Funktion zum Hinzufügen von Daten
  • Beispiel für handschriftliches Vue2.0-Daten-Hijacking
  • Implementierungsmethode für die bidirektionale Bindung von Vue-Daten
  • Vermeiden Sie den Missbrauch zum Lesen von Daten in Vue
  • Entwerfen Sie einen Datensammler mit Vue

<<:  Mysql 5.7.18 Verwenden von MySQL proxies_priv zur Implementierung einer ähnlichen Benutzergruppenverwaltung

>>:  Ein Beispiel für die schnelle Bereitstellung von Webanwendungen mit Tomcat in Docker

Artikel empfehlen

So verarbeiten Sie Blob-Daten in MySQL

Der spezifische Code lautet wie folgt: Paket epoi...

Detaillierte Erklärung des Docker-Befehls zum Sichern des Linux-Systems

Tar-Backup-System sudo tar cvpzf backup.tgz --exc...

Einführung in integrierte JavaScript-Objekte

Inhaltsverzeichnis 1. Eingebaute Objekte 2. Mathe...

Analyse der HTTP-Dienstschritte auf einer virtuellen VMware-Maschine

1. Verwenden Sie xshell, um eine Verbindung mit d...

So aktualisieren Sie v-for in Vue

Tipps: Die Methode zur Array-Änderung führt zur A...

Implementierung der Docker-Compose-Bereitstellung des ZK+Kafka+Storm-Clusters

Übersicht über die Clusterbereitstellung 172.22.1...

10 Fähigkeiten, die Frontend-Entwickler millionenschwer machen

Die Fähigkeiten, die Front-End-Entwickler beherrs...

js Implementierung des Verifizierungscode-Falls

In diesem Artikelbeispiel wird der spezifische Co...