uniapp パッケージ化されたアプレット レーダー チャート コンポーネントの完全なコード

uniapp パッケージ化されたアプレット レーダー チャート コンポーネントの完全なコード

効果画像:

実装コードは以下のとおりです

ビュー

<canvas id="radar-canvas" class="radar-canvas" type="2d"></canvas>

スタイル

.radar-canvas
    幅 550rpx
    高さ 550rpx
    マージン 0 自動

スクリプト

<スクリプト>
    "@/utils/common" から { toRpx } をインポートします。

    const numCount = 5 //要素の数 const numSlot = 4 //線上のノードの合計数 const mW = toRpx(275) //キャンバスの幅 const mCenter = mW / 2 //中心点 const mAngle = Math.PI * 2 / numCount //角度 const mRadius = mCenter - toRpx(43) //半径(減算された値は描画されたテキスト用のスペースを残すために使用されます)

    let canvas = null // キャンバス
    let canvasCtx = null // キャンバスコンテキスト

    エクスポートデフォルト{
        名前: 'RadarChart'、
        小道具: {
        },
        メソッド: {
            // レーダーチャートを初期化し、コンポーネントがマウントされたら initDrawRadar() を実行します {
                コンソールログ('init')
                const クエリ = uni.createSelectorQuery().in(this)
                クエリ.select('#radar-canvas').fields({ ノード: true, サイズ: true }).exec((res) => {
                    キャンバス = res[0].node
                    キャンバスCtx = キャンバス.getContext('2d')
                    const dpr = uni.getSystemInfoSync().pixelRatio
                    キャンバス.幅 = res[0].幅 * dpr
                    キャンバスの高さ = res[0].高さ * dpr
                    キャンバスCtx.scale(dpr, dpr)
                })
            },
            // 描画開始 handleDraw(radarData) {
                this.drawEdge()
                this.drawLinePoint()
                this.drawText(レーダーデータ)
                this.drawSubText(レーダーデータ)
                this.drawEdgeDot()
                this.drawRegion(レーダーデータ、'rgba(255, 105, 81, 0.4)')
            },
            // 円の端を描くdrawEdge() {
                canvasCtx.strokeStyle = '#EEEEEE'
                (i = 0; i < numSlot; i++) の場合 {
                    // 半径を計算する let radius = mRadius / numSlot * (i + 1)
                    (i === 3)の場合{
                        canvasCtx.lineWidth = toRpx(4) // 線の幅を設定する canvasCtx.beginPath()
                        canvasCtx.arc(mCenter, mCenter, radius, 0, 2 * Math.PI,) // 円の描画を開始します canvasCtx.stroke()
                    } それ以外 {
                        キャンバスCtx.lineWidth = toRpx(1)
                        定数スペース = 60 + 10 * (i+1)
                        this.drawDashCircle(mCenter, mCenter, 半径, スペース)
                    }
                }
            },
            // 外側の境界点を描画する drawEdgeDot(x, y) {
                キャンバスCtx.fillStyle = '#EEEEEF'
                キャンバスCtx.beginPath()
                (k = 0; k < numCount; k++) の場合 {
                    x = mCenter + mRadius * Math.cos(mAngle * k - Math.PI / 2) とします。
                    y = mCenter + mRadius * Math.sin(mAngle * k - Math.PI / 2) とします。
                    canvasCtx.arc(x, y, toRpx(5), Math.PI * 2, 0, true)
                    キャンバスCtx.closePath()
                }
                キャンバスCtx.fill()
            },
            // 点線の円を描く drawDashCircle(x, y, radius, space = 100) {
                定数ギャップ = 2 * Math.PI / スペース
                canvasCtx.lineCap = 'square'

                let start = 0; // 原点から描画を開始する while (start <= 2 * Math.PI) {
                    終了 = 開始 + ギャップ
                    canvasCtx.beginPath() //新しいパスを開始します canvasCtx.arc(x, y, radius, start, end, false)
                    開始 = ギャップ + 終了
                    canvasCtx.stroke() //現在のパスをストロークします}
            },
            // 接続ポイントを描画するdrawLinePoint() {
                キャンバスCtx.lineWidth = toRpx(1)
                キャンバスCtx.beginPath()
                (k = 0; k < numCount; k++) の場合 {
                    x = mCenter + mRadius * Math.cos(mAngle * k - Math.PI / 2) とします。
                    y = mCenter + mRadius * Math.sin(mAngle * k - Math.PI / 2) とします。
                    キャンバスCtx.moveTo(mCenter, mCenter)
                    キャンバスCtx.lineTo(x, y)
                }
                キャンバスCtx.stroke()
            },
            // テキスト情報を描画するdrawText(mData) {
                キャンバスCtx.fillStyle = '#222325'
                canvasCtx.font = `bold ${toRpx(14)}px PingFangSC-Medium, PingFang SC` //フォントを設定する for (let n = 0; n < numCount; n++) {
                    x = mCenter + mRadius * Math.cos(mAngle * n - Math.PI / 2) とします。
                    y = mCenter + mRadius * Math.sin(mAngle * n - Math.PI / 2) とします。
                    // テキストの表示位置をさまざまな位置で調整します const text = mData[n][0]
                    (n === 0)の場合{
                        canvasCtx.fillText(テキスト、x - toRpx(12)、y - toRpx(30))
                    }
                    (n === 1)の場合{
                        キャンバスCtx.fillText(テキスト、x + toRpx(12)、y)
                    }
                    (n === 2)の場合{
                        キャンバスCtx.fillText(テキスト、x + toRpx(12)、y + toRpx(20))
                    }
                    (n === 3)の場合{
                        canvasCtx.fillText(テキスト、x - toRpx(36)、y + toRpx(20))
                    }
                    (n === 4)の場合{
                        canvasCtx.fillText(テキスト、x - toRpx(40)、y)
                    }
                }
            },
            // テキスト情報を描画する drawSubText(mData) {
                キャンバスCtx.fillStyle = '#8D949B'
                canvasCtx.font = `${toRpx(11)}px PingFangSC-Medium, PingFang SC` //フォントを設定する for (let n = 0; n < numCount; n++) {
                    定数 x = mCenter + mRadius * Math.cos(mAngle * n - Math.PI / 2)
                    定数 y = mCenter + mRadius * Math.sin(mAngle * n - Math.PI / 2)
                    // テキストの表示位置をさまざまな位置で調整します const text = `(${mData[n][1]})`
                    (n === 0)の場合{
                        canvasCtx.fillText(テキスト、x - canvasCtx.measureText(テキスト).width / 2、y - toRpx(10))
                    }
                    (n === 1)の場合{
                        canvasCtx.fillText(テキスト、x + canvasCtx.measureText(テキスト).width、y + toRpx(16))
                    }
                    (n === 2)の場合{
                        canvasCtx.fillText(テキスト、x + canvasCtx.measureText(テキスト).width - toRpx(4)、y + toRpx(40))
                    }
                    (n === 3)の場合{
                        canvasCtx.fillText(テキスト、x - canvasCtx.measureText(テキスト).width - toRpx(12)、y + toRpx(40))
                    }
                    (n === 4)の場合{
                        canvasCtx.fillText(テキスト、x - canvasCtx.measureText(テキスト).width - toRpx(16)、y + toRpx(16))
                    }
                }
            },
            //赤いデータ領域を描画する(データと塗りつぶしの色)
            描画領域(mData, 色){
                キャンバスCtx.strokeStyle = '#FF6951'
                canvasCtx.lineWidth = toRpx(4) // 線の幅を設定する canvasCtx.beginPath()
                (m = 0 とします; m < numCount; m++){
                    x = mCenter + mRadius * Math.cos(mAngle * m - Math.PI / 2) * mData[m][1] / 100とします。
                    y = mCenter + mRadius * Math.sin(mAngle * m - Math.PI / 2) * mData[m][1] / 100とします。
                    キャンバスCtx.lineTo(x, y)
                }
                キャンバスCtx.closePath()
                canvasCtx.fillStyle = 色
                キャンバスCtx.fill()
                キャンバスCtx.stroke()
            },
        },
        マウント() {
            this.initDrawRadar()
        }
    }
</スクリプト>

これはコンポーネント呼び出しとしてカプセル化されていることに注意してください。初期化時に、const query = uni.createSelectorQuery().in(this), in(this) を追加する必要があります。そうしないと、ノードが見つからないというエラー メッセージが報告されます。

エクスポート関数 toRpx(val) {
    定数 res = uni.getSystemInfoSync()
    定数スケールレート = res.windowWidth / 375
    戻り値 * scaleRate
}

ページに電話する

<テンプレート>
    <!--レーダーチャート-->
    <レーダーチャート:radarData="radarData" ref="radarRef"></レーダーチャート>
</テンプレート>

'./components/radar' から RadarChart をインポートします。 

エクスポートデフォルト{
    コンポーネント:
        レーダーチャート、
    },
    データ() {
        戻る {
            レーダーデータ:[["リスニング", 0], ["スピーキング", 0], ["文法", 0], ["語彙", 0], ["読解", 0]],
        }
    },
    メソッド: {
        取得データ() {
            // リクエストデータが返されたら、コンポーネントメソッドを呼び出してこれをレンダリングします。$refs.radarRef.handleDraw(this.radarData)
        }
    }
}

要約する

uniapp カプセル化ミニプログラム レーダー チャート コンポーネントに関するこの記事はこれで終わりです。より関連性の高い uniapp カプセル化ミニプログラム レーダー チャート コンポーネント コンテンツについては、123WORDPRESS.COM で以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • uniapp プロジェクトの最適化方法と提案
  • vscodeを使用してuniappを開発する方法
  • uniappを使用してWeChatミニプログラムでEChartsを使用する方法
  • uniappがインターフェースドメイン名を動的に取得する方法を分析する
  • uniapp 要素ノードスタイルの動的変更の詳細な説明

<<:  Linux ファイルを分割するための split コマンドの詳細な説明

>>:  MySQL デッドロック ルーチン: 一意のインデックスの下でのバッチ挿入順序の不一致

推薦する

CSS テキスト強調を使用してテキストを強調するための実装コード

1. はじめにこれまで、テキストの特定の部分を強調したい場合、通常は太字にしたり明るい色を使用したり...

JSX を使用してコンポーネント パーサー開発を構築する例

目次JSX環境の構築プロジェクトの設定NPMを初期化するwebpackをインストールするBabelを...

DOCTYPEタイプの詳細な紹介

<br />通常、HTML では次の方法で DOCTYPE を宣言します。 <!D...

更新とデータ整合性処理のためのMySQLトランザクション選択の説明

MySQL のトランザクションはデフォルトで自動的にコミットされます (autocommit = 1...

MySQL スロークエリログの有効化と設定

導入MySQL スロー クエリ ログは、問題のある SQL ステートメントのトラブルシューティングや...

mysql5.6.8 ソースコードのインストールプロセス

カーネル: [root@opop ~]# cat /etc/centos-release CentO...

WeChat アプレット uniapp は左スワイプによる削除効果を実現します (完全なコード)

WeChatアプレットuniappは左スワイプで削除効果を実現成果を達成する1. スワイプしてリス...

要素ツリーコントロールは、ドロップダウンメニューとアイコンを統合します(ツリー+ドロップダウン+入力)

目次要件:実装手順:この記事では主に以下について説明します: カスタムツリーコントロール<el...

タオバオモールのホームページ上の大きな画像のデザイン構造に関する分析と意見(写真)

前回、Taobaoの詳細ページを分析した後(クリックして表示)、ショッピングモールの基本テンプレート...

docker-compose を使用して Clickhouse をすばやくデプロイする方法のチュートリアル

ClickHouse は、オープンソースの列指向 DBMS (Yandex によって開発) です。 ...

JavaScript イベント キャプチャ バブリングとキャプチャの詳細

目次1. イベントの流れ1. コンセプト2. DOMイベントフロー2. イベントの委任1. イベント...

Bootstrap5 ブレークポイントとコンテナの具体的な使用法

目次1. Bootstrap5 ブレークポイント1.1 モバイルファースト1.2 ブートストラップブ...

簡単な計算機を実装する小さなプログラム

この記事の例では、簡単な計算機を実装するための小さなプログラムの具体的なコードを参考までに共有してい...

VMware ESXi 6.0 および仮想マシンのインストール チュートリアルの展開 (画像とテキスト)

社内には以前からアイドル状態だった、構成の整ったサーバーがあったので、EXSI 6.0 を使って複数...

Vue + Axios リクエストインターフェース方式とパラメータ渡し方式の詳しい説明

目次1. リクエストを取得する: 2. 投稿リクエスト: 3. 拡張と補足Vue スキャフォールディ...