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 サンプルコード詳細説明
この記事では、JavaScript Canvasの動的なワイヤーフレーム効果を描画する具体的なコード...
Tomcatが同時リクエストを処理する方法を理解することで、スレッドプール、ロック、キュー、および...
説明: テキストエリアの値の改行を新しい行に変更しますコードをコピーコードは次のとおりです。 <...
この記事の例では、リストのシームレスなスクロールを実現するためのvueの具体的なコードを参考までに共...
目次1. React.Children.map 2. React.Children.forEach ...
目次序文現地調査ケースの再現要約する序文最近、友人が突然WeChatで連絡してきて、MySQLでデー...
ツール型ウェブサイトについて、まず疑問に思うのは、無数のオンラインウェブサイトの中で、どのようなウェ...
目次序文1. イベントとクリップボードを貼り付ける2. クリップボード内のコンテンツ形式3. HTM...
まず、テーブルを分割する必要がある理由について説明します。データシートが数百万に達すると、1 回のク...
目次1. pidファイルの紹介2.ソケットファイルの紹介要約:ソケット ファイル: Unix ドメイ...
この記事では、CentOS 7 環境でソース コードから MySQL 5.7 をインストールする方法...
Linux chmodコマンドを使用して、ターゲット ファイルにアクセス、読み取り、書き込み、または...
基礎リレーショナル データベースでは、各データ テーブルはファイルに相当し、異なるストレージ エンジ...
現在、Linux を使用するほとんどの人は、クラウド サーバーを使用するか、Windows 上に仮想...
目次1. Vueフロントエンドを構成する1. クロスドメイン構成を開発する2. 本番環境のクロスドメ...