React tsx はランダムな検証コードを生成します

React tsx はランダムな検証コードを生成します

React tsxは参照用にランダムな検証コードを生成します。具体的な内容は次のとおりです。

最近、tsx を使用して React を開発しました。検証コードをランダムに生成する良いプラグインが見つからなかったので、自分で作成しました。さっそく、コードを紹介します。

tsx ファイルは次のとおりです。

React コード スニペット。

"react" から * を React としてインポートします。

定数サイズ = 4;
const 検証コード = {
    幅: "32%",
    高さ: "32px",
    marginLeft: "5%",
    表示:"インラインブロック",
    position:"absolute" を "absolute" として、
    上:"0",
    右:"0",
}
デフォルトのクラス InputVerify をエクスポートし、React.Component<any, any> を拡張します。
    コンストラクタ(props) {
        スーパー(小道具);
        この状態 = {
            オプション:
                id: "verifycode", //コンテナID
                canvasId: "verifyCanvas", //キャンバスID
                width: "150", // デフォルトのキャンバス幅 height: "47", // デフォルトのキャンバス高さ type: "blend", // グラフィック検証コードのデフォルトのタイプ blend: 数字と文字の混合タイプ、number: 純粋な数字、letter: 純粋な文字 code: "",
                numArr: "0,1,2,3,4,5,6,7,8,9".split(","),
                文字配列: this.getAllLetter(),
            }
        }

    }

    コンポーネントマウント() {
        const self = this;
        タイムアウトを設定する(() => {
            自己._init();
            自己リフレッシュ();
        }, 100)
        this.props.onRef(this); // 親コンポーネントから渡された関数を呼び出し、それを親コンポーネントに割り当てます}

    _init() {
        con = document.getElementById(this.state.options.id); とします。
        キャンバスを document.createElement("キャンバス") にします。
        this.state.options.width = con.offsetWidth > 0 ? con.offsetWidth : "150";
        this.state.options.height = con.offsetHeight > 0 ? con.offsetHeight : "47";
        キャンバスID = this.state.options.canvasId;
        キャンバスの幅 = this.state.options.width;
        キャンバスの高さ = this.state.options.height;
        canvas.style.cursor = "ポインター";
        canvas.innerHTML = "お使いのブラウザのバージョンはキャンバスをサポートしていません";
        キャンバスに子要素を追加します。
        親を this とします。
        キャンバス.onclick = 関数(){
            親.refresh();
        }
    }

    リフレッシュ() {
        this.state.options.code = "";
        キャンバス: any = document.getElementById(this.state.options.canvasId);
        ctx = null とします。
        キャンバスのコンテキストを取得する場合
            ctx = キャンバス.getContext('2d');
        } それ以外 {
            戻る;
        }
        ctx.clearRect(0, 0, this.state.options.width, this.state.options.height);
        ctx.textBaseline = "中央";

        ctx.fillStyle = this.randomColor(180, 240);
        ctx.fillStyle = "rgba(0,0,0,0)"; //背景色 ctx.fillRect(0, 0, this.state.options.width, this.state.options.height);

        if (this.state.options.type == "blend") { // 検証コードの種類を判断する var txtArr = this.state.options.numArr.concat(this.state.options.letterArr);
        } それ以外の場合 (this.state.options.type == "number") {
            var txtArr = this.state.options.numArr;
        } それ以外 {
            var txtArr = this.state.options.letterArr;
        }

        (var i = 1; i <= サイズ; i++) {
            var txt = txtArr[this.randomNum(0, txtArr.length)];
            this.state.options.code += txt;
            ctx.font = this.randomNum(this.state.options.height / 2, this.state.options.height) + 'px SimHei'; // フォント サイズをランダムに生成します ctx.fillStyle = this.randomColor(50, 160); // フォントの色をランダムに生成します// ctx.fillStyle = "rgb(46, 137, 255)";// フォントの色を固定します ctx.shadowOffsetX = this.randomNum(-3, 3);
            ctx.shadowOffsetY = this.randomNum(-3, 3);
            ctx.shadowBlur = this.randomNum(-3, 3);
            ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
            var x = this.state.options.width / (サイズ + 1) * i;
            var y = this.state.options.height / 2;
            var deg = this.randomNum(-30, 30);
            /**回転角度と座標原点を設定します**/
            ctx.translate(x, y);
            ctx.rotate(deg * Math.PI / 180);
            ctx.fillText(txt, 0, 0);
            /**回転角度と座標原点を復元します**/
            ctx.rotate(-deg * Math.PI / 180);
            ctx.translate(-x, -y);
        }
        /**干渉線を描く**/
        (var i = 0; i < 4; i++) の場合 {
            ctx.strokeStyle = this.randomColor(40, 180);
            ctx.beginPath();
            ctx.moveTo(this.randomNum(0, this.state.options.width), this.randomNum(0, this.state.options.height));
            ctx.lineTo(this.randomNum(0, this.state.options.width), this.randomNum(0, this.state.options.height));
            ctx.stroke();
        }
    }

    検証(コード) {
        var code = code.toLowerCase();
        var v_code = this.state.options.code.toLowerCase();
        コード == v_code の場合 {
            true を返します。
        } それ以外 {
            これを更新します。
            false を返します。
        }
    }
    /**文字配列を生成する**/
    すべての文字を取得する() {
        var letterStr = "a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z、A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z";
        letterStr.split(","); を返します。
    }
    /**乱数を生成する**/
    ランダム数(最小, 最大) {
        Math.floor(Math.random() * (max - min) + min) を返します。
    }
    /**ランダムな色を生成する**/
    ランダムカラー(最小, 最大) {
        var r = this.randomNum(最小値, 最大値);
        var g = this.randomNum(最小値, 最大値);
        var b = this.randomNum(最小値, 最大値);
        "rgb(" + r + "," + g + "," + b + ")" を返します。
    }

    与える() {
        戻る (
            <div id="検証コード" style={検証コード}></div>
        )
    }
}

ここで、verifycode のスタイルは自分で変更します。通常はコード スニペットです。

「../InputVerify」からInputVerifyをインポートします。

この方法では、検証コードが自動的に生成されます。 どうやって検証するのでしょうか? 簡単にここに投稿します。 ここのフォームは antd を使用しており、一目でわかります。

コードスニペット。

エクスポート デフォルト ($Child: any = {}) => {
 //フォーム送信メソッド const onFinish = (値: 任意) => {
        if (values.vcode) {
            console.log($Child.validate(values.vcode))//子コンポーネントメソッド検証を呼び出す}
    };
    
 const onFinishFailed = (errorInfo: 任意) => {
        console.log('失敗:', errorInfo);
    };
 
 戻る (
  <フォーム
            {...レイアウト}
            名前="基本"
            onFinish={onFinish}
            onFinishFailed={onFinishFailed}
        >
         <Form.Item name="vcode" rules={[{ required: true, message: '認証コードを入力してください' }]}>
               <Input size="large" className="security-code" placeholder="確認コードを入力してください" />
            </フォーム.アイテム>
   ここで、親コンポーネントは onRef* を通じて子コンポーネントのメソッドを呼び出します。
   <InputVerify onRef={(ref) => { $Child = ref }}></InputVerify>
  </フォーム>
 )
}

上記の書き方は、確かにReactの古い書き方です。React 16.8以降はすべてフックを使用するので、これも変更します。コードは次のとおりです。

コードスニペット。

"react" から * を React としてインポートします。

定数サイズ = 4;
const 検証コード = {
    幅: "32%",
    高さ: "32px",
    marginLeft: "5%",
    表示:"インラインブロック",
    position:"absolute" を "absolute" として、
    上:"0",
    右:"0",
}

エクスポートデフォルト({cRef})=> {
    const [コード、setCode] = React.useState(Boolean);
    const [オプション、setOptions] = React.useState({
                id: "verifycode", //コンテナID
                canvasId: "verifyCanvas", //キャンバスID
                width: 150, // デフォルトのキャンバス幅 height: 47, // デフォルトのキャンバス高さ type: "blend", // グラフィック検証コードのデフォルトのタイプ blend: 数字と文字の混合タイプ、 number: 純粋な数字、 letter: 純粋な文字 code: "",
                numArr: "0,1,2,3,4,5,6,7,8,9".split(","),
                文字Arr: getAllLetter(),});

    React.useImperativeHandle(cRef,()=>({
        検証: (vcode) => {
            var vcode = vcode.toLowerCase();
            var v_code = options.code.toLowerCase();
            (vcode == v_code)の場合{
                コードを設定します(true);
            } それ以外 {
                リフレッシュ();
                コードを設定します(false);
            }
            戻りコード;
        }
    }));

    React.useEffect(()=>{
        _init();
        リフレッシュ();
    })

    関数_init() {
        con = document.getElementById(options.id); とします。
        キャンバス: any = document.createElement("キャンバス");
        options.width = con.offsetWidth > 0 ? con.offsetWidth : 150;
        options.height = con.offsetHeight > 0 ? con.offsetHeight : 47;
        キャンバスID = オプション.canvasId;
        キャンバスの幅 = オプションの幅;
        キャンバスの高さ = オプションの高さ;
        canvas.style.cursor = "ポインター";
        canvas.innerHTML = "お使いのブラウザのバージョンはキャンバスをサポートしていません";
        キャンバスに子要素を追加します。
        キャンバス.onclick = 関数(){
            リフレッシュ();
        }
    }

    関数リフレッシュ() {
        オプション.code = "";
        キャンバス: any = document.getElementById(options.canvasId);
        ctx = null とします。
        キャンバスのコンテキストを取得する場合
            ctx = キャンバス.getContext('2d');
        } それ以外 {
            戻る;
        }
        ctx.clearRect(0, 0, オプションの幅、オプションの高さ);
        ctx.textBaseline = "中央";

        ctx.fillStyle = ランダムカラー(180, 240);
        ctx.fillStyle = "rgba(0,0,0,0)"; //背景色 ctx.fillRect(0, 0, options.width, options.height);

        if (options.type == "blend") { // 確認コードの種類を判断する var txtArr = options.numArr.concat(options.letterArr);
        } それ以外の場合 (options.type == "number") {
            var txtArr = オプション.numArr;
        } それ以外 {
            var txtArr = options.letterArr;
        }

        (var i = 1; i <= サイズ; i++) {
            var txt = txtArr[randomNum(0, txtArr.length)];
            オプション.code += txt;
            ctx.font = randomNum(options.height / 2, options.height) + 'px SimHei'; // フォント サイズをランダムに生成 ctx.fillStyle = randomColor(50, 160); // フォントの色をランダムに生成 // ctx.fillStyle = "rgb(46, 137, 255)";// フォントの色を固定 ctx.shadowOffsetX = randomNum(-3, 3);
            ctx.shadowOffsetY = ランダム数値(-3, 3);
            ctx.shadowBlur = randomNum(-3, 3);
            ctx.shadowColor = "rgba(0, 0, 0, 0.3)";
            var x = options.width / (size + 1) * i;
            var y = options.height / 2;
            var deg = randomNum(-30, 30);
            /**回転角度と座標原点を設定します**/
            ctx.translate(x, y);
            ctx.rotate(deg * Math.PI / 180);
            ctx.fillText(txt, 0, 0);
            /**回転角度と座標原点を復元します**/
            ctx.rotate(-deg * Math.PI / 180);
            ctx.translate(-x, -y);
        }
        /**干渉線を描く**/
        (var i = 0; i < 4; i++) の場合 {
            ctx.strokeStyle = ランダムカラー(40, 180);
            ctx.beginPath();
            ctx.moveTo(ランダム数値(0, オプションの幅), ランダム数値(0, オプションの高さ));
            ctx.lineTo(ランダム数値(0, オプションの幅), ランダム数値(0, オプションの高さ));
            ctx.stroke();
        }
    }

        /**文字配列を生成する**/
    関数 getAllLetter() {
        var letterStr = "a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z、A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V、W、X、Y、Z";
        letterStr.split(","); を返します。
    }
    /**乱数を生成する**/
    関数 randomNum(最小: 任意、最大: 任意) {
        Math.floor(Math.random() * (max - min) + min) を返します。
    }
    /**ランダムな色を生成する**/
    関数 randomColor(最小値, 最大値) {
        var r = randomNum(最小値, 最大値);
        var g = randomNum(最小値, 最大値);
        var b = randomNum(最小値, 最大値);
        "rgb(" + r + "," + g + "," + b + ")" を返します。
    }

    戻る (
        <div id="検証コード" style={検証コード}></div>
    )
}

呼び出しも簡単です。親コンポーネントは React.useRef を宣言し、それを子コンポーネントに渡します。

React の子 Ref を定数で指定します。
//ここでコードはantDのFormフォームのonFinishイベントを通じて取得されます //子コンポーネントメソッドchildRef.current.validate(code)を呼び出します

<InputVerify cRef={childRef}></InputVerify>

さて、効果は次のようになります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Reactのスライド画像検証コードコンポーネントのサンプルコード
  • React Native 検証コードカウントダウンツールの共有
  • リアクトネイティブのチャットバブルとタイマーをカウントダウンにパッケージ化して検証コードを送信します
  • ReactNative SMS認証コードカウントダウン制御実装コード
  • React-Native で検証コードのカウントダウンを使用するボタンのサンプルコード

<<:  Tomcat 7.0 で仮想ディレクトリを設定し、仮想パスを構成する方法

>>:  Mybatis ファジークエリ実装方法

推薦する

CSS3 を使用して入力複数選択ボックスのスタイルをカスタマイズする例

原則: まず入力要素を非表示にし、次に CSS を使用してラベル要素のスタイルを設定します (他の要...

Alpine イメージに Ansible サービスを追加する方法

apk add ansible を使用して、alpine イメージに ansible サービスを追加...

Ubuntu 18.04 は mysql 5.7.23 をインストールします

以前、Ubuntu 16.04 に MySQL をスムーズにインストールしました。今回、Ubuntu...

ミニプログラムは左スライドのドロワーメニューをネイティブに実装します

目次WXS レスポンス イベントプランAページ構造とスタイルWXS イベントコールバック関数WXS ...

すべてまたは逆の選択機能を実現するJavaScript

この記事では、全選択または選択を反転する機能を実現するためのJavaScriptの具体的なコードを参...

Nodejs は readline を使用してコンテンツ入力を促すサンプルコード

目次序文1. batがjsを実行する2. ターミナルにバージョン番号を入力してパッケージ化コマンドを...

CSSアダプティブレイアウトは、サブ要素項目の全体的な中央揃えと内部項目の左揃えを実現します。

日常業務では、次のようなレイアウトに遭遇することがあります。親要素のフレーム (ブラウザのサイズに応...

Ubuntu の Docker で mysql5.6 をインストールする方法

1. mysql5.6をインストールする docker 実行 mysql:5.6すべてのアイテムのダ...

MySQLがウィンドウ関数で合計関数を実行するときに発生する可能性のあるバグ

MySql のウィンドウ関数を使用して統計データを収集する際に、小さな問題が見つかったので、それにつ...

XshellがvirtualBox仮想マシンに接続できない問題の解決策

まず、VirtualBox仮想マシンのネットワーク設定モードについて説明します。NAT+ホストオンリ...

Centos7でglibcをアップグレードするとシステム異常(起動できない)になる場合の解決方法

目次問題の原因:解決:解決:私は Centos7 を使用しています (理論的にはこの方法は Cent...

CentOS7.8 に mysql 8.0.20 をインストールするための詳細なチュートリアル

1. MySQLソフトウェアをインストールするMySQL 公式 Yum リポジトリ、MySQL バー...

Linux カーネルプログラミングにおけるコンテナの of() 関数の紹介

序文Linux カーネルプログラミングでは、マクロ関数 container_of(ptr, type...

JavaScript で実装された 6 つの Web ページ画像カルーセル効果の詳細な説明

目次1. マウスがカルーセル モジュール上を通過すると、左右のボタンが表示され、モジュールを離れると...

meta name="" content="の機能の詳細な説明

1. 文法: <meta name="名前" content="...