1. 序文Web ページのポップアップ ボックスは、ユーザーにメッセージを通知する必要がある場合 (アラート)、ユーザーに確認する必要がある場合 (確認)、ユーザーが情報を追加する必要がある場合 (プロンプト) など、非常に一般的な機能です。ユーザーがフォームに入力できるようにボックスをポップアップ表示することもできます (モーダル ダイアログ)。 ポップアップ ウィンドウが表示された後、開発者は次の操作を続行するために、ポップアップ ウィンドウがいつ閉じられるかを知る必要があります。 古い UI コンポーネントでは、これは次のようなイベント コールバックを通じて実行されます。 showDialog(コンテンツ、タイトル、{ closed: function() { console.log("ダイアログボックスが閉じられました"); } }) ただし、ダイアログ ボックスの動作。ご覧のとおり、ポップアップは表示されますが、後続のコードはブロックされず、ユーザーの動作であるため、開発者はいつ閉じられるかわかりません。非同期なので、Promise にカプセル化し、 非同期関数 asyncShowDialog(コンテンツ、タイトル、オプション) { 新しいPromiseを返します(resolve => { showDialog(コンテンツ、タイトル、{ ...オプション、 終了: 解決済み }); }); } (非同期() => { asyncShowDialog(コンテンツ、タイトル) を待機します。 console.log("ダイアログ ボックスが閉じられました"); })(); ポップアップ ウィンドウの基本的な非同期動作は、このように単純です。それだけですか?それでも満足できない場合は、さらに勉強してください。 2. ポップアップコンポーネントを2つ見つけるAnt Design Vue はイベント形式を使用します。「OK」ボタンをクリックすると これら 2 つのイベント処理関数は、パラメーター オブジェクトの モーダル.確認({ ... オンOK() { // 「OK」ボタンをクリックすると、読み込みアニメーションが表示され、1秒後にダイアログボックスが閉じられます return new Promise(resolve => { タイムアウトを設定します(解決、1000); }); } ... }); Element Plus は Promise 形式を使用します。ダイアログボックスを開くときに、確認またはキャンセル処理関数をパラメータとして渡すのではなく、開発者が 試す { ElMessageBox.confirm(...) を待機します。 // ここで処理するにはOKボタンを押します} catch(err) { // キャンセルボタンの押下はここで処理されます } Element Plus 処理方法では、ダイアログ ボックスが閉じられた後にのみビジネスを処理できる必要があります。これは Promise を使用する場合の制限でもあります。すでにカプセル化された Promise オブジェクトに新しいロジックを挿入することは困難です。 Ant Design のように したがって、Ant Design のような処理は次のように記述できます。 試す { ElMessageBox.confirm({を待つ ... beforeClose: async (アクション、インスタンス、完了) => { 新しい Promise(resolve => setTimeout(resolve, 1000)) を待機します。 終わり(); } }); // ここで処理するにはOKボタンを押します} catch(err) { // キャンセルボタンの押下はここで処理されます } 3. 自分で作る2 つの弾丸ボックス コンポーネントの動作処理を分析した結果、優れたエクスペリエンスを備えた弾丸ボックス コンポーネントには次の特性があることがわかっています。
次に、自分で書いて、上記の機能をどのように実装するかを見てみましょう。ただし、今回はデータ処理ではなく動作を主に学習するため、Vue フレームワークは使用せず、DOM 操作を直接使用し、その後 jQuery を導入して DOM 処理を簡素化します。 ダイアログ ボックスの HTML スケルトンも比較的シンプルです。下部にマスク レイヤー、上部に固定サイズの <div class="ダイアログ" id="ダイアログテンプレート"> <div class="ダイアログウィンドウ"> <div class="dialog-title">ダイアログボックスのタイトル</div> <div class="dialog-content">ダイアログコンテンツ</div> <div class="ダイアログ操作"> <button type="button" class="ensure-button">確認</button> <button type="button" class="cancel-button">キャンセル</button> </div> </div> </div> ここではテンプレートとして定義されており、プレゼンテーションのたびにそこから DOM を複製し、閉じられたときに破棄したいと考えています。 スタイルシートの内容は長いので、以下のサンプルリンクから取得できます。この記事の焦点はコードとその進化です。 最も簡単な方法は、jQuery を使用して複製して表示することですが、表示する前に、必ず $("#dialogTemplate").clone().removeAttr("id").appendTo("body").show(); これを関数にラップし、「OK」ボタンと「キャンセル」ボタンの処理を追加します。 関数 showDialog(コンテンツ, タイトル) { 定数 $dialog = $("#dialogTemplate").clone().removeAttr("id"); // ダイアログ ボックスのタイトルと内容を設定します (簡単な例なので、テキストのみを処理します) $dialog.find(".dialog-title").text(タイトル); $dialog.find(".dialog-content").text(コンテンツ); // イベント プロキシ経由で (またはプロキシなしで) 2 つのボタン イベントを処理します $dialog .on("クリック", ".ensure-button", () => { ダイアログを削除します。 }) .on("クリック", ".cancel-button", () => { ダイアログを削除します。 }); $dialog.appendTo("body").show(); } ポップアップ ウィンドウの基本的なロジックが明らかになります。ここで、2 つの最適化を行います。① 関数 showDialog(...) { ... 定数を破棄 = () => { $dialog.fadeOut(200, () => $dialog.remove()); }; $ダイアログ .on("クリック", ".ensure-button", 破棄) .on("クリック", ".cancel-button", 破棄); $dialog.appendTo("body").fadeIn(200); } 3.1. Promiseのカプセル化この時点では、ポップアップ ウィンドウを正常に表示/閉じることはできますが、「OK」または「キャンセル」ロジック コードを挿入する方法はありません。前述のように、インターフェースはイベントまたはプロミスの 2 つの形式で提供できます。ここでは、プロミス メソッドを使用します。 「OK」をクリックすると解決され、「キャンセル」をクリックすると拒否されます。 関数 showDialog(...) { ... const promise = new Promise((resolve, deny) => { $ダイアログ .on("クリック", ".ensure-button", () => { 破壊する(); 解決します("OK"); }) .on("クリック", ".cancel-button", () => { 破壊する(); 拒否("キャンセル"); }); }); $dialog.appendTo("body").fadeIn(200); promise() を返します。 } カプセル化は完了しましたが、問題があります。destroy 関数 showDialog(...) { ... 定数を破棄 = () => { 新しいPromiseを返します(resolve => { $dialog.fadeOut(200, () => { ダイアログを削除します。 解決する(); }); }); }; const promise = new Promise((resolve, deny) => { $ダイアログ .on("クリック", ".ensure-button", 非同期() => { 破棄を待ちます。 解決します("OK"); }) .on("クリック", ".cancel-button", 非同期() => { 破棄を待ちます。 拒否("キャンセル"); }); }); ... } 3.2. 特定の場合に非同期待機を許可する「確認」をクリックしても「キャンセル」をクリックしても、非同期待機のためにポップアップ ウィンドウが表示されたままになります。ただし、例として、ここでは「OK」のケースのみを扱います。 この非同期待機プロセスはポップアップ ウィンドウに挿入する必要があり、パラメータの形式でのみ挿入できます。したがって、処理関数を まず、 関数 showDialog(コンテンツ、タイトル、オプション = {}) { ... } 次に、$dialog.on("click", ".ensure-button", ...) イベントを処理します。 $ダイアログ .on("クリック", ".ensure-button", 非同期() => { const { onOk } = オプション; // オプションから onOk を取得します。関数の場合は、処理を待つ必要があります if (typeof onOk === "function") { 定数 r = onOk(); // onOk() の結果が Promise のようなオブジェクトかどうかを判定します // Promise のようなオブジェクトのみが非同期待機を必要とします if (typeof r?.then === "function") { 定数 $button = $dialog.find(".ensure-button"); // 非同期の待機プロセス中に、ユーザーに何らかのフィードバックを提供する必要があります // ここでは面倒なので、読み込みアニメーションは使用せず、フィードバックにはテキストのみを使用します $button.text("処理中..."); rを待つ; // 完了後、閉じる前に 200 ミリ秒のフェードアウト プロセスがあるため、 // したがって、ユーザーにタイムリーなフィードバックを提供するために、ボタンのテキストを「完了」に変更する必要があります $button.text("Done"); } } 破棄を待ちます。 解決します("OK"); }) これで、このポップアップ ボックスの動作は基本的に処理され、呼び出し例は次のようになります。 const 結果 = showDialog を待機します( 「こんにちは、これがダイアログボックスの内容です」 「こんにちは」 { onOk: () => 新しい Promise((resolve) => { setTimeout(resolve, 3000); }) } ).catch(msg => msg); // ここでは、キャンセルによって発生した拒否が、try...catch... の使用を避けるために解決に変換されます。 console.log(result === "ok" ? "OKを押してください" : "キャンセルを押してください"); 3.3. 詳細を改善するダイアログボックスの最後に しかし、現在、 非同期関数 showDialog(コンテンツ、タイトル、オプション = {}) { ... if (options.type === "alert") { $dialog.find(".キャンセルボタン").remove(); } ... } 次に、最終的な showDialog(result === "ok" ? "OKを押してください" : "キャンセルを押してください", "プロンプト", { type: "alert" }); 3.4. 改革
const dialog = showDialog("こんにちは、これがダイアログ ボックスの内容です", "こんにちはと言ってください"); // 処理関数をPromiseのonOkに挿入する dialog.onOk = () => 新しい Promise((resolve) => { setTimeout(resolve, 3000); }); const 結果 = dialog.catch(msg => msg) を待機します。 showDialog(result === "ok" ? "OKを押してください" : "キャンセルを押してください", "プロンプト", { type: "alert" }); ここで注意すべき点がいくつかあります: 上記は、vue.js フロントエンド Web ページ ポップアップ ボックスの非同期動作の例の詳細な分析です。vue.js フロントエンド非同期 Web ページ ポップアップ ボックスの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
>>: CSS3 カスタムスクロールバースタイル::webkit-scrollbar サンプルコード詳細説明
背景何が起こったかというと、Luzhu は偶然、宇宙で最高の外部スピーカーを備えた携帯電話について知...
1. HTML送信ボタンと下部ボタンの基本構文構造1. HTML送信ボタン入力タグで type=&...
MySQL はほとんどの場合、GROUP BY クエリと DISTINCT クエリを同様に処理します...
序文実際のプロジェクトでは、最も一般的な処理は計算とループロジックである可能性があります。配列でre...
解決: <head> に次のコードを追加します。コードをコピーコードは次のとおりです。 ...
この記事では、参考のために、WeChatアプレットのチャットルームを実装するための具体的なコードを例...
序文スタートアップ企業が最初はモノリシック アプリケーションを主要なアーキテクチャとして使用し、通常...
今日は Docker でのネットワーク設定を試し、後で忘れないようにプロセスを記録しました。 (シス...
MySQL の基盤となるデータ構造が B+ ツリーであることは誰もが知っていますが、ではなぜ赤黒ツリ...
注: MySQL5.7 で root パスワードをクラックするには、パスワード認証をスキップしてデー...
1. オブジェクト指向のクラス継承これまでの章では、JavaScript のオブジェクト モデルがプ...
タイトル通りです!一般的に使用される font-family はブラウザの組み込みフォントを読み込み...
MySql データベースのサブクエリ:サブクエリ: 選択クエリ ステートメント内に別の選択ステートメ...
使用シナリオ既存のサーバー A と B の場合、サーバー A の指定されたディレクトリ (たとえば、...
<br />一般的に、「標準的な Web ページ」のファイル構成は XHTML CSS ...