概要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 をインストールするための詳細なチュートリアル
NULL が頻繁に使用されるのはなぜですか? (1)Javaのnull Java の NullPoi...
前回の記事では、Docker を使用して Laravel アプリケーションをデプロイする方法について...
HTML フォーム タグのチュートリアル。このセクションでは、主に Web ページで INPUT タ...
この点呼装置は簡易版であり、自動停止の必要性を考慮していないため、点呼を開始した後、停止ボタンをクリ...
目次1. Jquery を使用する手順: (1)jsライブラリをインポートする(2)ページ読み込みイ...
SUSE Linuxでルートパスワードを忘れた場合の解決方法SUSE (Linux オペレーティング...
MySQL インストール ファイルには、msi 形式と zip 形式の 2 種類があります。クリック...
Google Chrome では、ログインに成功すると、パスワードを記憶するかどうかを尋ねるメッセー...
目次序文1. 親コンポーネントが子コンポーネントに値を渡す2. サブコンポーネントのprops型制約...
この記事では、Dockerでイメージ情報を表示する方法を学ぶ必要があります。 1. imagesコマ...
1. 戻るボタンhistory.back() を使用してブラウザの「戻る」ボタンを作成します。 &l...
多くの人が、ウェブサイト上のテキストはデザインする必要があるのかと疑問に思うかもしれません。多く...
効果プレビューアイデア現在のリストを最後の項目までスクロールし、すぐに最初の項目に戻ります。問題1....
この記事は主に、MySQLを再インストールする際のクリーンでないアンインストールのさまざまな問題をま...
1. 以前 QT5.13 バージョンをダウンロードしましたが、インストール後、Qtcreator を...