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

推薦する

MySQL 5.7.21 履歴データディレクトリからデータを復元するチュートリアルの解凍バージョン

状況の説明: データベースが異常に起動およびシャットダウンしたため、サービスを再度起動したときに「起...

nginxの基礎を学ぶ

目次1. nginx とは何ですか? 2. nginx で何ができるのか? 2.1 フォワードプロキ...

表内のコンテンツオーバーフローのレイアウト方法について

コンテンツオーバーフローとは何ですか?実際、テキストが大量にある場合、コンテンツ領域がそれだけの長さ...

メニューのホバー効果を実現するCSS3

結果: html <nav id="nav-1"> <a cl...

MySQLのロック機構の詳細な説明

序文データの一貫性と整合性を確保するために、あらゆるデータベースにはロック メカニズムが備わっていま...

Docker ベースの Tomcat クラスタと Nginx ロード バランシングの展開の概要

目次前面に書かれた1. Ngixnイメージの作成2. Java Web (Tomcat) アプリケー...

CSS3+ベジェ曲線でスケーラブルな入力検索ボックス効果を実現

では、早速レンダリングを見てみましょう。 コア コードはtransition: cubic-bezi...

DockerにMinIOをインストールするための詳細な手順

目次1. docker環境が正常かどうかを確認する2. miniIOイメージをダウンロードする3. ...

ウェブページに埋め込まれた Flash と IE、FF、Maxthon の互換性の問題

いろいろ苦労した後、インターネットで検索したり、以前の会社のプロジェクトを探したり、他の人のプロジェ...

MySQL で URL タイムゾーンの罠を回避する方法

序文最近、MySQL 6.0.x 以降の jar を使用する場合、コード URL リンクで serv...

MySQLカスタム関数の簡単な使用例

この記事では、例を使用して MySQL カスタム関数の使用方法を説明します。ご参考までに、詳細は以下...

mysqlreplicate を使って MySQL マスタースレーブを素早く構築する方法

導入mysql-utilities ツールセットは、DBA のツールボックスとも言えるさまざまなツー...

フロントエンドは画像を遅延ロードする方法を知っている必要があります(3つの方法)

目次1. 遅延読み込みとは何ですか? 2. 遅延読み込みを実装する🌄: 2.1 最初の方法: 2.2...

mysql mycat ミドルウェアのインストールと使用

1. mycatとはエンタープライズアプリケーション開発のための完全にオープンソースの大規模データベ...

練習と面接のための Linux シェル スクリプトのヒント 9 つを共有する

予防1) 先頭にインタープリターを追加します: #!/bin/bash 2) 構文のインデントに 4...