Vue+canvas は、ウォーターフォール チャートを上から下までリアルタイムに更新する効果を実現します (QT と同様)

Vue+canvas は、ウォーターフォール チャートを上から下までリアルタイムに更新する効果を実現します (QT と同様)

早速ですが、デモ画像をご紹介します。実装されている機能は、左側に凡例、右側にウォーターフォール チャート、マウスを動かすと現在の座標に対応するデータ情報がポップアップ表示されるというものです (最適化の余地がありますので、ぜひ試してみてください)。

イラストで使用されているプラ​​グイン

npmプラグインcolormapをインストールすることをお勧めします

ウォーターフォールチャート本体

ここでは説明しません。すべてネイティブタグと Vue バインドイベントです。実際のプロジェクトの状況に応じてコンポーネントにカプセル化できます。ここではまとめて記述しました。

<テンプレート>
    <div>
        <div class="content">
            <div class="neirong">
                <!--凡例-->
                <div class="凡例">
                    <canvas ref="凡例"></canvas>
                </div>
                <!--ウォーターフォール チャート-->
                <div class="waterFall" ref="waterFallContent"
                     @mousemove="waterFallMove($event)"
                     @mouseleave="waterFallLeave"
                >
                    <canvas ref="滝"></canvas>
                    <!--マウスをポップアップ ボックス内に移動します-->
                    <div ref="tip" class="tip"></div>
                </div>
            </div>
        </div>
    </div>
</テンプレート>

使用されたデータはこちら

  • カラーマップ: カラーライブラリ
  • 伝説: 伝説
  • waterFall: ウォーターフォールチャート
  • waterFallList: ウォーターフォール チャートのソース データ
  • waterFallIndex: ウォーターフォール チャート タイマーで使用されるカウント インデックス
  • waterFallCopyList: ウォーターフォール チャートの 2 次元配列 (表示データの一時保存に使用)
  • waterFallIntervals: 滝タイマー
  • waterFallWidth: ウォーターフォール チャートの幅 (バックエンドから返されるデータの長さ)
  • waterFallHeight: 滝の高さ(レンダリング回数としても理解できます。たとえば、30 回のレンダリングが完了します)
  • maxNum: 凡例の最大値
  • minNum: 凡例の最小値
<スクリプト>
    エクスポートデフォルト{
        名前: "インデックス",
        データ() {
            戻る {
                カラーマップ: [],
                凡例: null、
                ウォーターフォール: null、
                滝リスト: [],
                滝インデックス: 0,
                waterFallCopyList: [],
                降水間隔: null、
                滝幅: 0,
                滝の高さ: 0,
                最大数: 10,
                最小数: 0
            }
        },

以下は具体的な方法です。ざっくりと書いていますが、よく読んでみてください。役に立ったと思ったら、ぜひ取り入れてください。足りないところがあれば、自由に改変していただいて構いません。

ここではメソッド呼び出しについては説明しません。ページを離れるとタイマーが破壊されます。

マウント() {
            dx = thisとする
            dx.setColormap()
            dx.createLegendCanvas()
            dx.queryChartList()
        },
        破壊された() {
            dx = thisとする
            クリア間隔(dx.waterFallIntervals)
        },

カラーライブラリを作成する

詳細は上記プラグインの公式サイトにて詳しく紹介しておりますのでご参照ください。

setColormap() {
      dx = thisとする
      colormap = require('colormap') とします。
      dx.colormap = カラーマップ({
          カラーマップ: 'ジェット',
          シェード数: 150,
          フォーマット: 'rba',
          アルファ: 1,
   })
},

伝説を創る

凡例キャンバスを作成します(){
                dx = thisとする
                legendRefs = dx.$refs.legend とします。
                dx.legend = legendRefs.getContext('2d')
                legendCanvas = document.createElement('canvas') とします。
                凡例キャンバスの幅 = 1
                legendCanvasTemporary = legendCanvas.getContext('2d') とします。
                const imageData = legendCanvasTemporary.createImageData(1, dx.colormap.length)
                (i = 0 とします; i < dx.colormap.length; i++) {
                    定数カラー = dx.カラーマップ[i]
                    imageData.data[imageData.data.length - i * 4 + 0] = color[0]
                    imageData.data[imageData.data.length - i * 4 + 1] = color[1]
                    imageData.data[imageData.data.length - i * 4 + 2] = color[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.length、50、0、200、dx.legend.canvas.height)
            },

ウォーターフォールチャートの作成

 ウォーターフォールキャンバスを作成します(){
                dx = thisとする
                waterFall = dx.$refs.waterFall とします
                dx.waterFall = waterFall.getContext('2d')
                滝の幅 = dx.滝の幅
                waterFall.height = dx.$refs.waterFallContent.offsetHeight
            },

1本の線で画像を描く

 rowToImageData(データ) {
                dx = thisとする
                dx.$refs.waterFallContent が未定義の場合 {
                    canvasHeight = Math.floor(dx.$refs.waterFallContent.offsetHeight / dx.waterFallHeight) とします。
                    imgOld = dx.waterFall.getImageData(0, 0, dx.waterFallWidth, canvasHeight * dx.waterFallIndex + 1) とします。
                    const imageData = dx.waterFall.createImageData(data.length, 1)
                    (i = 0、i < imageData.data.length、i += 4 とします) {
                        定数 cindex = dx.colorMapData(データ[i / 4], 0, 130)
                        定数 color = dx.colormap[cindex]
                        imageData.data[i + 0] = 色[0]
                        imageData.data[i + 1] = 色[1]
                        imageData.data[i + 2] = 色[2]
                        画像データ.data[i + 3] = 255
                    }
                    (i = 0; i < canvasHeight; i++ とします) {
                        dx.waterFall.putImageData(イメージデータ, 0, i)
                    }
                    dx.waterFall.putImageData(imgOld, 0, キャンバスの高さ)
                }
            },

データに対応するカラーマップの色を返します

colorMapData(データ、outMin、outMax) {
                dx = thisとする
                データ <= dx.minNum の場合 {
                    戻り値 outMin
                } そうでない場合 (データ >= dx.maxNum) {
                    戻り値 outMax
                }
                Math.round(((data - dx.minNum) / (dx.maxNum - dx.minNum)) * outMax) を返します。
            },

マウスをウォーターフォールチャートに移動する

            waterFallMove(イベント) {
                dx = thisとする
                dataWidth = (dx.$refs.waterFallContent.offsetWidth / dx.waterFallWidth).toFixed(2) とします。
                dataHeight = (dx.$refs.waterFallContent.offsetHeight / dx.waterFallHeight).toFixed(2) とします。
                x = Math.floor(event.offsetX / dataWidth) とします。
                y = Math.floor(event.offsetY / dataHeight) とします。
                試す {
                    dx.$refs.tip.innerHTML = '値:' + JSON.parse(JSON.stringify(dx.waterFallCopyList[y][x]))
                    xx = イベント.オフセットX + 5 とします。
                    yy = event.offsetY - 20 とします。
                    イベントオフセットX > 1300の場合{
                        xx = イベント.オフセットX - 160
                        yy = イベント.オフセットY - 20
                    }
                    dx.$refs.tip.style.position = '絶対'
                    dx.$refs.tip.style.left = xx + 'px'
                    dx.$refs.tip.style.top = yy + 'px'
                    dx.$refs.tip.style.display = 'ブロック'
                } キャッチ (e) {
                    dx.$refs.tip.style.display = 'なし'
                }
            },

マウスをウォーターフォールチャートの外に移動します

ウォーターフォールリーブ() {
                dx = thisとする
                dx.$refs.tip.style.display = 'なし'
            },

ウォーターフォールチャート偽データシミュレーション

クエリチャートリスト() {
                dx = thisとする
                dx.waterFallWidth = 1500
                dx.waterFallHeight = 30
                データ = []
                (i = 0; i < 1500; i++) の場合 {
                    data.push(Math.floor(Math.random() * (20 - 1)) + 1)
                }
                dx.waterFall === nullの場合{
                    dx.createWaterFallCanvas(データの長さ)
                }
                dx.rowToImageData(データ)
                dx.waterFallCopyList.unshift(データ)
                dx.waterFallIndex++
                dx.waterFallIndex > dx.waterFallHeight の場合 {
                    dx.waterFallCopyList.pop()
                }
                dx.waterFallIntervals = setTimeout(() => {
                    dx.queryChartList()
                }, 1000)
            },

スタイルコード

.neirong {
        幅: 1800ピクセル;
        高さ: 100%;
        マージン: 80px 自動;
        ディスプレイ: フレックス;
        コンテンツの中央揃え: 中央;
    }

    。伝説 {
        幅: 25px;
        高さ: 500px;
    }

    キャンバス {
        幅: 100%;
        高さ: 100%;
    }

    .滝 {
        幅: 1500ピクセル;
        高さ: 500px;
        位置: 相対的;
    }

    。ヒント {
        ポインタイベント: なし;
        表示: なし;
        背景色: #0404049e;
        境界線の半径: 10px;
        色: #fff;
        パディング: 10px;
        ボックスのサイズ: 境界線ボックス;
    }

この時点で、デモは基本的にエラーなしで実行できます。コードはあまり高度ではありません。私も初心者で、記事を書くのは今回が初めてです。大物たちが私にもっと良い提案をしてくれることを期待し、一生懸命勉強します。また、同じような要件に直面し、アイデアがない友人たちが、穴に足を踏み入れた私の経験から学び、より早く成長できることを願っています。

これで、vue+canvas がウォーターフォール チャート効果 (QT に類似) を上から下へリアルタイム データ更新する方法についてのこの記事は終了です。vue+canvas のリアルタイム更新ウォーターフォール チャートに関するその他の関連コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Vue2.0/3.0双方向データバインディングの実装原理の詳細説明
  • vuexの強制リフレッシュによるデータ損失問題の分析
  • Vue はデータの変更をどのように追跡しますか?
  • Vueデータ割り当て問題の解決
  • Vueはデータを初期状態にリセットします
  • Vue コンポーネント値転送中のデータ損失の分析と解決
  • SpringBoot+Vueでデータ追加機能を実現
  • 手書きの Vue2.0 データハイジャックの例
  • Vueデータ双方向バインディング実装方法
  • Vueでデータを読み取るためにこれを悪用しないでください
  • Vue でデータコレクターを設計する

<<:  Mysql 5.7.18 MySQL proxies_priv を使用して同様のユーザーグループ管理を実装する

>>:  Docker で Tomcat を使用して Web アプリケーションを迅速にデプロイする方法の例

推薦する

MySQLの共有ロックと排他ロックの使用例の分析

この記事では、例を使用して MySQL の共有ロックと排他ロックの使用方法を説明します。ご参考までに...

Linuxで権限が拒否された場合の解決策の詳細な説明

許可が拒否されました:その理由は、ファイルの読み取り、書き込み、作成、削除などの権限がないためです。...

MySql ストレージ エンジンとインデックスに関する知識のまとめ

ストレージエンジンデータベース ストレージ エンジンとは何ですか?データベース エンジンは、データベ...

MySQLの文字タイプは大文字と小文字を区別します

デフォルトでは、MySQLの文字タイプは大文字と小文字を区別しません。つまり、name='A...

docker compose デプロイメントにおけるマスタースレーブレプリケーションの実装

目次構成解析サービス構築ディレクトリ構造ファイルを作成インスタンス構成サービスを開始するテストRed...

CentOS7 は yum を使用して mysql 8.0.12 をインストールします

この記事では、centos7にyumを使用してMySQL 8.0.12をインストールする詳細な手順を...

MySQL 挿入時間の 8 時間の違いの問題の解決方法

MySQL挿入時の8時間の時差の問題を解決する通常、jdbc の URL にはいくつかのパラメータを...

MySQLチュートリアルDMLデータ操作言語の例の詳細な説明

目次1. データ操作言語 (DML) 2. データを追加する(挿入) 3. 既存のテーブルをコピーし...

JavaScriptを使用してSMS認証コード間隔を送信する機能を実装する

多くのアプリやウェブサイトでは、ログインやアカウント登録の際にSMS認証コード1を送信する場所があり...

CentOS6.5 でファイル共有サービス Samba を構築するチュートリアル

Samba サービス:このコンテンツはサンバサービス学習者の参考用ですケースの説明:企業の管理者は、...

Vue + OpenLayers クイックスタートチュートリアル

Openlayers は、WebGIS クライアント向けのモジュール式で高性能かつ機能豊富な Jav...

MySQL共通ストレージエンジンの機能と使用方法の詳細な説明

この記事では、一般的な MySQL ストレージ エンジンの機能と使用方法を例を使って説明します。ご参...

データページング効果を実現する js オブジェクト

この記事の例では、データのページング効果を実現するためのjsオブジェクトの具体的なコードを参考までに...

読めばわかるVueの8つのヒント

1. v-forでは常に:keyを使用するデータを操作する必要があるときにプログラムを一定かつ予測可...

CentOS 7.4 にソースコードから MySQL 8.0 をインストールするための詳細なチュートリアル

目次1. 環境2. 準備3. MySQL 8.0.11をインストールするMySQL 8 の公式バージ...