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 をインストールするための詳細なチュートリアル

推薦する

IE8 互換性について: X-UA-compatible 属性の説明

問題の説明:コードをコピーコードは次のとおりです。 <meta http-equiv=&quo...

Vue 3 での watch と watchEffect の新しい使い方

目次1. 時計の新しい使い方1.1. ウォッチの使用構文1.2. 複数の属性値を監視する1.3. 参...

MySQL 集計統計データの低速クエリの最適化

前面に書かれた注文テーブル、アクセス記録テーブル、商品テーブルなど、日常生活でデータベースを操作する...

Vue の新しい組み込みコンポーネントの使用方法の詳細な説明

目次1. テレポート1.1 テレポートの紹介1.2 テレポートの使用1.3 プレビュー効果2. サス...

AWSサーバーリソースを無料で使用する方法を教えます

AWS - Amazon のクラウド コンピューティング サービス プラットフォーム以前、AWS の...

MySQL 8.0 のユーザーとロールの管理原則と使用方法の詳細

この記事では、MySQL 8.0 のユーザーとロールの管理について例を挙げて説明します。ご参考までに...

Linux ソフトウェアのインストール場所を確認する簡単な方法

1. ソフトウェアのインストールパスを確認します。 Linuxソフトウェアをインストールできる場所は...

速度、読み込み、Web アプリケーションなどにおける div と table の違い。

1: 速度と読み込み方法の違いdivとtableの違いは速度ではなく、読み込み方法です。速度はネット...

nginx が動的と静的の分離を実装する方法の例

目次server1にnginxをデプロイするサーバーにlnmpを展開するノード3にhttpdをデプロ...

MySQL 5.7 でルートパスワードを変更する方法

MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...

Nginx でバージョン番号を隠す方法

Nginx はバージョン番号を非表示にする実稼働環境では、セキュリティ上の脆弱性の漏洩を避けるために...

NODE.JS を使用して WEBSERVER を作成する手順

目次Node.jsとはNodeJSをインストールするNode を使用して Hello World を...

Tomcat でよく使われるフィルターの詳細な説明

目次1. クロスドメインフィルタ CorsFilter 1.1 設定例1.2 パラメータの説明2. ...

MYSQLについては、データ型と操作テーブルを知る必要があります

データ型と操作データテーブル1.1 MySQL 型: 整数 1.2 MySQL データ型: 浮動小数...

MySQLインデックスを最適化する方法

1. MySQL のインデックスの使用方法インデックスは、特定の列の値を持つ行をすばやく見つけるため...