概要Web プロジェクトでは、ログイン、登録、その他の機能はすべてフォームの送信を必要とします。ユーザーのデータをバックエンドに送信する前に、フロントエンドは通常、フォームが入力されているかどうか、フォームの長さ、パスワードが仕様に準拠しているかどうかなど、その能力の範囲内でいくつかの検証を行う必要があります。フロントエンド検証により、準拠していないフォームの送信を回避できます。 次の検証ロジックを持つフォームがあるとします。
戦略パターンを使用しないフォーム検証戦略モードが使用されていない場合、最初に考えられる検証モードは通常次のようになります。 <本文> <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)){ 警告('電話番号の形式が正しくありません') 戻る; } } </スクリプト> </本文> このコードの書き方は非常に一般的ですが、欠点も明らかです。
戦略パターンを使用して最適化するまず、検証関数をオブジェクトとしてカプセル化します。 定数戦略 = { 空(値、エラーメッセージ){ 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の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Linux環境でIPV6接続をサポートするようにmysql5.6を設定する方法
>>: CentOS7 に ElasticSearch 6.4.1 をインストールするための詳細なチュートリアル
この記事では、例を使用して MySQL ビューの原理と使用方法を説明します。ご参考までに、詳細は以下...
まず、フォームを送信するいくつかの方法を見てみましょう。 1. <!--一般的な送信ボタン--...
序文MySQL 5.1.6 以降、非常にユニークな機能であるイベント スケジューラが追加されました。...
Dockerの機能1) すぐに始められるユーザーがプログラムを「Docker 化」するには、わずか数...
Linux で実行可能プログラムまたは so の依存ライブラリを表示します。 Linux の実行可能...
このデータベース クエリ ステートメントは、インターネット上の 50 個のデータベース クエリ練習問...
目次序文: 1. ユーザー権利の概要2. 実際の権限管理序文:データベースのユーザー権限管理について...
目次1. v-bindの主要ソースコードの分析1. v-bind属性はどこに均一に保存されるか: a...
目次概要1. 入力および出力プロパティの概要2. 入力属性3. プロパティバインディングは親コンポー...
Compose のいくつかの部分は、何らかの方法で環境変数を扱います。このチュートリアルは、必要な情...
この記事の例では、ページ切り替え効果を実現するためのJSコードの具体的なコードを参考までに共有してい...
序文テキスト検索ツールといえば、Linux で最も便利でよく使われるツールの 1 つである grep...
MySQL-8.0.22-winx64のデータベースインストールチュートリアルは参考になります。具体...
目次1. 概要2. MySQLデータ型の詳細な説明1) 文字列型2) 整数型3) 浮動小数点型4) ...
MySQLでホワイトリストアクセスを設定する手順1. ログイン mysql -uroot -pmys...