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 ビューの原理と使用方法を説明します。ご参考までに、詳細は以下...

ウェブフォーム送信方法の詳細な概要

まず、フォームを送信するいくつかの方法を見てみましょう。 1. <!--一般的な送信ボタン--...

MySQL スケジュールタスク例チュートリアル

序文MySQL 5.1.6 以降、非常にユニークな機能であるイベント スケジューラが追加されました。...

DockerとFastDFSのインストールコマンドと使い方の詳しい説明

Dockerの機能1) すぐに始められるユーザーがプログラムを「Docker 化」するには、わずか数...

Linux で so または実行可能プログラムの依存ライブラリを表示します

Linux で実行可能プログラムまたは so の依存ライブラリを表示します。 Linux の実行可能...

最も完全な 50 の MySQL データベース クエリ演習

このデータベース クエリ ステートメントは、インターネット上の 50 個のデータベース クエリ練習問...

MySQLユーザー権限管理の詳細な説明

目次序文: 1. ユーザー権利の概要2. 実際の権限管理序文:データベースのユーザー権限管理について...

vue の v-bind を理解する

目次1. v-bindの主要ソースコードの分析1. v-bind属性はどこに均一に保存されるか: a...

Angularの親子コンポーネント通信の詳細な説明

目次概要1. 入力および出力プロパティの概要2. 入力属性3. プロパティバインディングは親コンポー...

Docker Compose で利用可能な環境変数の詳細な説明

Compose のいくつかの部分は、何らかの方法で環境変数を扱います。このチュートリアルは、必要な情...

ページ切り替え効果を実現するJSコード

この記事の例では、ページ切り替え効果を実現するためのJSコードの具体的なコードを参考までに共有してい...

Linux 最速のテキスト検索ツール ripgrep (grep の最良の代替)

序文テキスト検索ツールといえば、Linux で最も便利でよく使われるツールの 1 つである grep...

MySQL 8.0.22 winx64 のインストールと設定方法のグラフィックチュートリアル

MySQL-8.0.22-winx64のデータベースインストールチュートリアルは参考になります。具体...

MySql データ型チュートリアル例の詳細な説明

目次1. 概要2. MySQLデータ型の詳細な説明1) 文字列型2) 整数型3) 浮動小数点型4) ...

MySQLでホワイトリストアクセスを設定する方法

MySQLでホワイトリストアクセスを設定する手順1. ログイン mysql -uroot -pmys...