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

Sechs wichtige Selektoren in CSS (merken Sie sie sich in drei Sekunden)

Von: https://blog.csdn.net/qq_44761243/article/de...

Detaillierte Erklärung des Prinzips und der Funktion des JavaScript-Closures

Inhaltsverzeichnis Einführung Verwendung von Vers...

Vue3 + el-table realisiert Zeilen- und Spaltenkonvertierung

Inhaltsverzeichnis Zeilen-Spalten-Konvertierung A...

Detaillierte Erklärung zu Javascript-Dateien und Blobs

Inhaltsverzeichnis Datei() Grammatik Parameter Be...

Natives js zur Realisierung der Bild-Upload-Steuerung

In diesem Artikelbeispiel wird der spezifische Co...

Zusammenfassung der Zeilenumbruchprobleme bei Textbereichen in HTML

Kürzlich stieß ich auf das Problem, ob die Daten b...

Detaillierte Erklärung der Stammverzeichniseinstellungen in nginx.conf

Bei der Konfiguration von nginx.conf treten immer...

Detaillierte Erläuterung der Verwendung von Docker Commit

Manchmal müssen Sie bestimmte Abhängigkeiten im B...

Eine kurze Analyse der Verwendung von HTML-Float

Einige Verwendungen von Float Linke Aufhängung: f...

Das mobile Vue-Terminal realisiert den Finger-Gleiteffekt

In diesem Artikelbeispiel wird der spezifische Co...

Einführung in die Verwendung von Ankern (benannte Anker) in HTML-Webseiten

Die folgenden Informationen sind aus dem Internet ...