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 デッドロック ルーチン: 一意のインデックスの下でのバッチ挿入順序の不一致

推薦する

vue ディレクティブ v-bind の使用と注意点

目次1. v-bind: 要素の属性にデータをバインドできる2. v-bind: は次のように省略で...

MySQL killコマンドの実行原理の詳細な説明

目次キル命令実行原理命令実行特性クエリ実行の強制終了の原則接続終了の実装原則中断される可能性はありま...

Apache Webサーバーのインストールと設定方法

信頼性が高く、人気があり、簡単に構成できる Web サーバーである Apache で独自の Web ...

MySQLオンラインDDLの使用に関する詳細な説明

目次文章LOCKパラメータアルゴリズムパラメータCOPY TABLE プロセスIN-PLACEプロセ...

CSS変数var()の使い方を理解する必要があります

Web プロジェクトがどんどん大きくなると、CSS は天文学的な大きさと複雑さを増します。この問題を...

コードを通じてHTMLエスケープ文字を識別する方法について説明します

データ内に次のような特徴を持つ「 ' 」などの文字が含まれることがあります。 &# ...

Mac MySQL のルートパスワードをリセットするチュートリアル

免責事項:このパスワード リセット方法は、Homebrew によってインストールされた MySQL ...

虫眼鏡コンポーネントのネイティブ js 実装

この記事の例では、参考までに虫眼鏡コンポーネントを開発するためのjsの具体的なコードを共有しています...

Nest.js 認証検証方法の例

目次0x0 はじめに0x1 RBAC 実装0x2 クレームベースの承認0x3 統合 CASL 0x4...

Windows10でのMySQL 5.7.21のインストールと設定のチュートリアル

この記事では、MySQL 5.7.21 のインストールと設定方法を記録し、皆様と共有します。 1. ...

MySQLの高可用性と高パフォーマンスのクラスタを構築する方法

目次MySQL NDB Clusterとはクラスター構築のための準備作業クラスターのデプロイを開始す...

HTML DOCTYPEの略語

DOCTYPE が次のとおりである場合:コードをコピーコードは次のとおりです。 <!DOCTY...

Vue3 Vue CLI マルチ環境設定

目次1. はじめに2. 切り替え1. 開発および本番環境の設定ファイルを追加する2. 複数の環境をサ...

Nginx 構成の場所の一致ルールの例の説明

nginx の設定命令のスコープは、main、server、location の 3 種類に分けられ...

Linux での JDK と Tomcat のアップロードと設定に関する詳細なチュートリアル

準備1. 仮想マシンを起動する2. gitツールルートアカウントでログインルートアカウントを使用して...