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

Detaillierte Erklärung der Funktionsweise von Nginx

So funktioniert Nginx Nginx besteht aus einem Ker...

Hinweise zum passenden MySql 8.0 und entsprechenden Treiberpaketen

MySql 8.0 entsprechendes Treiberpaket passend Nac...

So verwenden Sie Nexus, um JAR-Pakete zu privaten Servern hinzuzufügen

Warum müssen wir einen privaten Nexus-Server erst...

Unterschiede zwischen diesem Schlüsselwort in NodeJS und Browsern

Vorwort Jeder, der JavaScript gelernt hat, muss s...

WeChat-Applet implementiert Puzzlespiel

In diesem Artikel finden Sie den spezifischen Cod...

Docker stellt über einen Port eine Verbindung zu einem Container her

Docker-Container-Verbindung 1. Netzwerk-Port-Mapp...

So richten Sie einen FTP-Server in CentOS7 ein

FTP wird hauptsächlich für die Dateiübertragung v...

11 Gründe, warum Bootstrap so beliebt ist

Vorwort Bootstrap, das beliebteste Front-End-Entw...