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

推薦する

Linuxカーネルの浮動小数点演算のサポートに関する簡単な説明

現在、ほとんどの CPU は浮動小数点ユニット (FPU) をサポートしています。FPU は、プロセ...

DELL R730 サーバーの構成 RAID とインストール サーバー システムとドメイン制御の詳細なグラフィック チュートリアル

最近、会社で DELL R730 サーバーを購入したのですが、偶然次のチュートリアルを見つけたので、...

MySQL スロークエリ関連パラメータの原理の分析

MySQL スロー クエリ (正式名称はスロー クエリ ログ) は、MySQL によって提供されるロ...

MySQLシリーズのMariaDBサーバーのインストール

目次チュートリアルシリーズ1. yumパッケージマネージャーを使用してMariaDBサーバーをインス...

フロントエンドブラウザのフォントサイズが12px未満のソリューション

序文最近プロジェクトに取り組んでいたとき、UI デザインのフォント サイズは 10 ピクセルでした。...

CocosCreatorメッセージ配信メカニズムの詳細な説明

概要この記事は、ゲームビジネスアーキテクチャに関連するコンテンツの紹介から始まります。ゲームビジネス...

Linux (Ubuntu) での MySQL 5.7.17 のインストールと設定のチュートリアル

序文以前、MySQL 5.6 をインストールしました。3 か月後、開発者から MySQL で JSO...

MySQL コール初心者が犯しがちな 11 の間違いのまとめ

序文セキュリティ部門からSQLインジェクションやXSS攻撃の脆弱性などに関する警告メールを頻繁に受け...

CSS 属性値 clear:right が機能しない理由の詳細

clear プロパティを使用してフロートをクリアすることはよくあることであり、clear プロパティ...

Vueはログインジャンプを実装する

この記事では、ログインジャンプを実装するためのVueの具体的なコードを例として紹介します。具体的な内...

JavaScriptのクローン作成についての簡単な説明

目次1. 浅いクローニング2. ディープクローニング1. 浅いクローニング浅いクローンでは配列やオブ...

入力スクリプトなしでタイプ拡張を使用する方法

序文JS の型付けが弱く、記述基準が緩く、開発ツールのサポートが弱いため、前任者のコードをメンテナン...

独自の Docker イメージを作成して Dockerhub にアップロードする方法

1. まず、自分のdockerhubアカウントを登録します。登録アドレス: https://hub....

印刷広告を成功させるための「3I」基準

国内の多くの広告主にとって、印刷広告の制作と評価は、しばしばかなり主観的です。自分の感情や美的感覚に...

Linux環境にMySQLデータベースをインストールする詳細なチュートリアル

1. データベースをインストールする1) yum -y install mysql-server (...