JavaScript 戦略パターンを使用してフォームを検証する方法

JavaScript 戦略パターンを使用してフォームを検証する方法

概要

Web プロジェクトでは、ログイン、登録、その他の機能はすべてフォームの送信を必要とします。ユーザーのデータをバックエンドに送信する前に、フロントエンドは通常、フォームが入力されているかどうか、フォームの長さ、パスワードが仕様に準拠しているかどうかなど、その能力の範囲内でいくつかの検証を行う必要があります。フロントエンド検証により、準拠していないフォームの送信を回避できます。

次の検証ロジックを持つフォームがあるとします。

  • ユーザー名は空ではありません
  • パスワードの長さは6文字以上です
  • 携帯電話番号は次の形式に準拠しています

戦略パターンを使用しないフォーム検証

戦略モードが使用されていない場合、最初に考えられる検証モードは通常次のようになります。

<本文>
    <form id="登録フォーム">
        <label for="username">ユーザー名を入力してください: <input type="text" name="username"></label>
        <label for="password">パスワードを入力してください: <input type="password" name="password"></label>
        <label for="phone">パスワードを入力してください: <input type="text" name="phone"></label>
    </フォーム>
    <スクリプト>
        定数フォーム = document.querySelector('.registerForm');
        フォーム.onsubmit = 関数(){
            if(form.username.value === ''){
                アラート('ユーザー名は空にできません')
                戻る;
            }
            if(form.password.value.length < 6){
                警告('パスワードの長さは6文字未満にできません')
                戻る;
            }
            if(!/(^1[3|5|8][0-9]{9}$)/.test(form.phone.value)){
                警告('電話番号の形式が正しくありません')
                戻る;
            }
        }
    </スクリプト>
</本文>

このコードの書き方は非常に一般的ですが、欠点も明らかです。

  • onsubmit 関数は大きすぎるため、すべてのルールをカバーするには多くの if-else ステートメントが含まれています。
  • onsubmit 関数には柔軟性がありません。新しい検証ルールを入力する場合は、関数の内容を変更する必要があり、オープンクローズ原則に違反します。
  • コードの再利用性が低い。別のフォームを作成する場合、重複するコードを大量にコピーする必要があります。

戦略パターンを使用して最適化する

まず、検証関数をオブジェクトとしてカプセル化します。

定数戦略 = {
    空(値、エラーメッセージ){
        if(値の長さ === 0){
            errMsg を返します。
        }
    },
    minLength(値、長さ、エラーメッセージ){
        if(値の長さ < len){
            errMsg を返します。
        }
    },
    isMobile(値、エラーメッセージ){
        if(!/(^1[3|5|8][0-9]{9}$)/.test(値)){
            errMsg を返します。
        }
    }
}

また、ターゲット フォームに検証ルールを追加するために使用される Validator クラスも必要です。その使用方法は次のとおりです。

const 検証 = 関数(){
    const バリデータ = 新しい Validator();
    validator.add(Form.userName, 'empty', 'ユーザー名は空にできません');
    validator.add(Form.password, 'minLength:6', 'パスワードの長さは6文字未満にすることはできません');
    validator.add(Form.phone, 'isMobile', '携帯電話番号の形式が正しくありません');
    errMsg を Validator.start() に設定します。
    errMsg を返します。
}

コードに示されているように、バリデータインスタンスには 3 つのパラメータを受け取る add メソッドがあります。最初のパラメータは検証が必要なフォームインスタンス、2 番目のパラメータは検証メソッドで、コロンの後のパラメータが渡されます。 3 番目は検証が失敗した場合のエラー メッセージです。

start メソッドは検証を開始するために使用されます。検証が失敗した場合は、失敗したことを示すプロンプト メッセージが返され、後続のロジックで処理できます。

Validator クラスの記述:

クラス Validator {
    コンストラクタ(){
        このルールは、
    }
    要素、ルール、エラーを追加します。
        const args_arr = ルールを分割します(":");
        this.rules.push(()=>{
            const ハンドラ = args_arr.shift();
            args_arr.unshift(要素の値);
            args_arr.push(err);
            strategies[handler].apply(elem, args_arr) を返す
        })
    }
    始める(){
        errmsg = [] とします
        for(let i = 0; i < this.rules.length; i++ ){
            定数err = this.rules[i]();
            もしエラーが起きたら
                errmsg.push(err)
            }
        }
        errmsg.join(","); を返します。
    }
}

戦略モードを使用して、構成方法を使用してフォームの検証を完了します。これらのルールは、将来フォームが検証されるあらゆる場所で使用できるため、変更や再利用がより便利になります。

1つのフォームフィールドに複数の検証ルールを追加する

現在、私たちのコードには欠点があり、フォーム項目に 1 つの検証ルールしか割り当てられず、フォームに複数の検証ルールを実装できないため、コードを改善する余地があります。

クラス Validator{
    // ···
    add(要素、ルール){
        ルール.forEach(ルール => {
            const args_arr = ルール.strategy.split(":");
            this.rules.push(()=>{
                const ハンドラ = args_arr.shift();
                args_arr.unshift(要素の値);
                args_arr.push(rule.errMsg);
                strategies[handler].apply(elem, args_arr) を返す
            })
        });
    }
    // ···
}

const 検証 = 関数(){
    const バリデータ = 新しい Validator();
    validator.add(Form.username,[{
        戦略: '空'、
        エラーメッセージ: 'ユーザー名は空にできません'
    }]);
    validator.add(Form.password, [{
        戦略: 'minLength:6',
        errMsg: 'パスワードの長さは 6 文字未満にできません'
    }]);
    バリデーター.add(Form.phone, [{
        戦略: 'isMobile'、
        errMsg: '携帯電話番号の形式が正しくありません'
    }, {
        戦略: '空'、
        エラーメッセージ: '電話番号は空欄にできません'
    }]);
    errMsg を Validator.start() に設定します。
    errMsg を返します。
}

パラメータを渡すときにオブジェクト配列を渡し、add 関数に対応する配列処理ロジックを追加するだけです。

戦略パターンの利点

アドバンテージ:

  • 複数の条件付き選択ステートメントを避ける
  • オープンクローズ原則を実装すると、機能の使用の切り替え、理解、拡張が容易になります。
  • コードの再利用性の向上

要約する

Peter Norvig 氏は、関数がファーストクラス オブジェクトである言語では、戦略パターンは見えず、戦略は値が関数である変数であると述べました。実際には、カプセル化された戦略関数を、それを使用するターゲットにパラメータとして渡し、ターゲットから呼び出されるというプロセスです。戦略パターンをうまく活用することで、パターンをより深く理解できるだけでなく、関数を使用する利点も理解できるようになります。

上記は、JavaScript戦略モードを使用してフォームを検証する方法の詳細です。JavaScriptの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Javascriptで戦略パターンを実装する方法
  • フォーム検証からのJavaScript戦略モードの使用の詳細な説明
  • JavaScript デザインパターン戦略パターン実装原則詳細説明
  • JSフォーム検証プラグインデータとロジック分離操作例分析[戦略モード]
  • JavaScript デザインパターン - 戦略パターンの原則と使用例
  • JS デザインパターンにおける戦略パターンの概念と使用法の分析
  • JavaScriptは非同期検証フォームを同期フォームに書き換えます
  • js がフォームを検証した後にフォームを送信する 3 つの方法の概要
  • JavaScript戦略モードを簡単にマスター

<<:  Linux環境でIPV6接続をサポートするようにmysql5.6を設定する方法

>>:  CentOS7 に ElasticSearch 6.4.1 をインストールするための詳細なチュートリアル

推薦する

MySql データベースのサブクエリと高度なアプリケーションの簡単な分析

MySql データベースのサブクエリ:サブクエリ: 選択クエリ ステートメント内に別の選択ステートメ...

アクセス速度を上げるためにウェブサイトを最適化する方法の更新

最近、同社はitpubを皮切りに、コーポレートウェブサイト傘下の全サイトの評価を開始した。そのために...

NginxにおけるRewriteのリダイレクト設定と実践の詳しい解説

1: アドレス書き換えとア​​ドレス転送の意味を理解する。アドレス書き換えとア​​ドレス転送は異なる...

HTML テーブル マークアップ チュートリアル (29): セルのライト境界線の色属性 BORDERCOLORLIGHT

セルでは、明るい境界線の色を個別に定義できます。 > 基本構文<TD ボーダーカラーライ...

Vueコンポーネントの動的コンポーネントの詳細な説明

目次要約する要約する配列が変更されると、対応するデータを動的にロードしますシナリオ: 異なるコンポー...

jQueryは要素を追加した後に元のイベントが実行されない問題を解決します

まずエラーコードを見てみましょう。 html: <テーブルボーダー="1"...

JavaScript の高度なプログラミングの基本参照型

目次1. 日付2. 正規表現3. オリジナルパッケージタイプ序文:参照値(オブジェクト)は、 Dat...

VueはGraphVisを使用して無限に拡張された関係グラフを開発します

1. GraphVis 公式サイトにアクセスして、対応する js をダウンロードします。js の新し...

div 要素に終了タグがないため、Web ページを開くことができません

最初は速度の問題だと思ったので、その後、すべての画像リンク リクエストをクロスサイト接続ではなくサイ...

Dockerfile テキストファイルの使用例の分析

Dockerfile は、イメージをビルドするために使用されるテキスト ファイルです。テキスト コン...

Vueが初めて要素を取得できなかったときの解決記録

序文Vue で要素を初回取得できない問題の解決方法は、ポップアップ ウィンドウで要素を取得するために...

nginxリバースプロキシwebSocket設定の詳細な説明

最近、プロジェクトで作業しているときに webSocket プロトコルを使用し、WeChat アプレ...

Docker コンテナにおける Patroni の簡単な分析

目次イメージの作成ファイル構造Dockerファイルエントリポイント関数ファイルを生成するイメージを構...

MySQL 接続数を設定する方法 (接続数が多すぎる)

mysql使用中に接続数が超過していることが判明しました~~~~ [root@linux-node...