1. VorwortPopup-Fenster kommen auf Webseiten sehr häufig vor, z. B. wenn Benutzer über eine Nachricht informiert werden müssen (Warnung), wenn Benutzer eine Bestätigung benötigen (Bestätigung) oder wenn Benutzer Informationen hinzufügen müssen (Eingabeaufforderung) ... Sie können sogar ein Fenster öffnen, damit Benutzer ein Formular ausfüllen können (Modaldialog). Nachdem das Popup-Fenster angezeigt wurde, müssen Entwickler wissen, wann das Popup-Fenster geschlossen wird, um mit dem nächsten Vorgang fortzufahren. In den älteren UI-Komponenten geschieht dies durch Ereignisrückrufe, die ungefähr so aussehen: showDialog(Inhalt, Titel, { geschlossen: function() { console.log("Dialogfeld wurde geschlossen"); } }) Allerdings verhält sich das Dialogfeld. Sie sehen, es wird angezeigt, blockiert jedoch nicht den folgenden Code, und der Entwickler weiß nicht, wann es geschlossen wird, da es sich um ein Benutzerverhalten handelt. Da es asynchron ist, wäre es einfacher, es in Promise zu kapseln und mit async-Funktion asyncShowDialog(Inhalt, Titel, Optionen) { gib ein neues Versprechen zurück (Auflösen => { showDialog(Inhalt, Titel, { ...Optionen, geschlossen: gelöst }); }); } (asynchron () => { warte auf asyncShowDialog (Inhalt, Titel); console.log("Dialogfeld wurde geschlossen"); })(); So einfach ist das grundlegende asynchrone Verhalten des Popup-Fensters, und das war’s? Wenn Sie immer noch nicht zufrieden sind, studieren Sie weiter! 2. Finden Sie zwei Popup-Komponenten Ant Design Vue verwendet die Form von Ereignissen. Wenn Sie auf die Schaltfläche "OK" klicken, wird das Diese beiden Ereignisbehandlungsfunktionen werden über Modal.bestätigen({ ... beiOk() { // Nach dem Klicken auf die Schaltfläche "OK" wird die Ladeanimation angezeigt und das Dialogfeld wird nach einer Sekunde geschlossen return new Promise(resolve => { setTimeout(auflösen, 1000); }); } ... }); Element Plus verwendet das Promise-Format. Beim Öffnen des Dialogfelds wird die Bestätigungs- oder Stornierungsverarbeitungsfunktion nicht als Parameter übergeben, sondern direkt ein Promise-Objekt zurückgegeben, das Entwickler über versuchen { warte auf ElMessageBox.confirm(...); //Drücken Sie die OK-Taste, um es hier zu verarbeiten} catch(err) { // Das Drücken der Abbrechen-Taste wird hier verarbeitet } Die Element Plus-Verarbeitungsmethode erfordert, dass die Geschäftsabwicklung erst nach Schließen des Dialogfelds durchgeführt werden kann. Dies ist auch die Einschränkung bei der Verwendung von Promise – es ist schwierig, neue Logik in ein bereits gekapseltes Promise-Objekt einzufügen. Wenn Sie vor dem Schließen Daher kann die Ant Design-ähnliche Verarbeitung wie folgt geschrieben werden: versuchen { warte auf ElMessageBox.confirm({ ... beforeClose: async (Aktion, Instanz, erledigt) => { warte auf neues Promise(resolve => setTimeout(resolve, 1000)); Erledigt(); } }); //Drücken Sie die OK-Taste, um es hier zu verarbeiten} catch(err) { // Das Drücken der Abbrechen-Taste wird hier verarbeitet } 3. Machen Sie selbst einsNach der Analyse der Verhaltensverarbeitung der beiden Bulletbox-Komponenten wissen wir bereits, dass eine Bulletbox-Komponente mit guter Erfahrung die folgenden Eigenschaften aufweisen sollte:
Als Nächstes schreiben wir selbst eines und sehen, wie die oben genannten Funktionen implementiert werden. Da wir jedoch hauptsächlich Verhalten und nicht Datenverarbeitung untersuchen, verwenden wir nicht das Vue-Framework, sondern direkt DOM-Operationen und führen dann jQuery ein, um die DOM-Verarbeitung zu vereinfachen. Auch das HTML-Skelett des Dialogfelds ist relativ einfach: Unten eine Maskenebene, darüber eine <div Klasse="Dialog" id="Dialogvorlage"> <div Klasse="Dialogfenster"> <div class="dialog-title">Dialogfeldtitel</div> <div class="dialog-content">Dialoginhalt</div> <div Klasse="Dialogoperation"> <button type="button" class="ensure-button">Bestätigen</button> <button type="button" class="cancel-button">Abbrechen</button> </div> </div> </div> Hier wird es als Vorlage definiert und wir hoffen, jedes Mal zur Präsentation einen DOM daraus zu klonen und ihn beim Schließen zu zerstören. Der Inhalt des Stylesheets ist lang und kann über den Beispiellink unten abgerufen werden. Der Code und seine Entwicklung stehen im Mittelpunkt dieses Artikels. Die einfachste Möglichkeit zur Darstellung besteht darin, es mit jQuery zu klonen und anzuzeigen. Denken Sie jedoch vor der Anzeige daran, $("#dialogTemplate").clone().removeAttr("id").appendTo("body").show(); Packen Sie es in eine Funktion ein und fügen Sie eine Verarbeitung für die Schaltflächen „OK“ und „Abbrechen“ hinzu: Funktion showDialog(Inhalt, Titel) { const $dialog = $("#dialogTemplate").clone().removeAttr("id"); // Titel und Inhalt des Dialogfelds festlegen (einfaches Beispiel, behandelt also nur Text) $dialog.find(".dialog-title").text(Titel); $dialog.find(".dialog-content").text(Inhalt); // Zwei Schaltflächenereignisse über Ereignisproxy verarbeiten (oder ohne Proxy) $dialog .on("klicken", ".ensure-button", () => { $dialog.entfernen(); }) .on("klicken", ".abbrechen-button", () => { $dialog.entfernen(); }); $dialog.appendTo("body").anzeigen(); } Die grundlegende Logik des Popup-Fensters wird offenbart. Nehmen wir nun zwei Optimierungen vor: ① Kapseln Sie Funktion zeigeDialog(...) { ... const zerstören = () => { $dialog.fadeOut(200, () => $dialog.remove()); }; $dialog .on("klicken", ".ensure-button", zerstören) .on("klicken", ".abbrechen-Schaltfläche", zerstören); $dialog.appendTo("body").fadeIn(200); } 3.1. Verkapselung von VersprechenAn diesem Punkt kann das Popup-Fenster normal geöffnet/geschlossen werden, es gibt jedoch keine Möglichkeit, den Logikcode „OK“ oder „Abbrechen“ einzufügen. Wie bereits erwähnt, kann die Schnittstelle in zwei Formen bereitgestellt werden: Ereignisse oder Versprechen. Hier wird die Promise-Methode verwendet. Wenn Sie auf „OK“ klicken, wird das Problem behoben, und wenn Sie auf „Abbrechen“ klicken, wird es abgelehnt. Funktion zeigeDialog(...) { ... const promise = neues Versprechen((lösen, ablehnen) => { $dialog .on("klicken", ".ensure-button", () => { zerstören(); lösen("ok"); }) .on("klicken", ".abbrechen-button", () => { zerstören(); ablehnen("abbrechen"); }); }); $dialog.appendTo("body").fadeIn(200); Versprechen zurückgeben(); } Die Kapselung ist abgeschlossen, es gibt jedoch ein Problem: Funktion zeigeDialog(...) { ... const zerstören = () => { gib ein neues Versprechen zurück (Auflösen => { $dialog.fadeOut(200, () => { $dialog.entfernen(); lösen(); }); }); }; const promise = neues Versprechen((lösen, ablehnen) => { $dialog .on("klicken", ".ensure-button", async () => { warte auf Zerstörung(); lösen("ok"); }) .on("klicken", ".abbrechen-button", async () => { warte auf Zerstörung(); ablehnen("abbrechen"); }); }); ... } 3.2. Erlaube asynchrones Warten, wenn bestimmteUnabhängig davon, ob Sie auf „Bestätigen“ oder „Abbrechen“ klicken, kann das Popup-Fenster für das asynchrone Warten angezeigt bleiben. Exemplarisch wird hier aber nur der „OK“-Fall behandelt. Dieser asynchrone Wartevorgang muss in das Popup-Fenster eingefügt werden und kann nur in Form von Parametern eingefügt werden. Daher müssen Sie Ändern Sie zuerst Funktion showDialog(Inhalt, Titel, Optionen = {}) { ... } Behandeln Sie dann das Ereignis $dialog.on("click", ".ensure-button", ...): $dialog .on("klicken", ".ensure-button", async () => { const { onOk } = Optionen; // onOk aus den Optionen holen. Wenn es eine Funktion ist, muss sie auf die Verarbeitung warten, wenn (typeof onOk === "function") { const r = onOk(); // Bestimme, ob das Ergebnis von onOk() ein Promise-ähnliches Objekt ist // Nur Promise-ähnliche Objekte benötigen asynchrones Warten if (typeof r?.then === "function") { const $button = $dialog.find(".ensure-button"); // Während des asynchronen Wartevorgangs muss dem Benutzer eine Rückmeldung gegeben werden. // Ich bin hier faul und verwende keine Ladeanimation, sondern nur Text für die Rückmeldung. $button.text("Wird verarbeitet …"); warte auf r; // Denn nach Abschluss erfolgt vor dem Schließen ein 200 Millisekunden langer Ausblendvorgang, // Daher ist es notwendig, den Buttontext in „Fertig“ zu ändern, um den Benutzern rechtzeitig Feedback zu geben. $button.text("Fertig"); } } warte auf Zerstörung(); lösen("ok"); }) Nun wird das Verhalten dieses Popup-Fensters grundsätzlich verarbeitet. Das aufrufende Beispiel lautet: const Ergebnis = warte auf ShowDialog( „Hallo, hier ist der Inhalt des Dialogfelds“, "Sag Hallo", { onOk: () => neues Versprechen((auflösen) => { setTimeout(auflösen, 3000); }) } ).catch(msg => msg); // Hier wird die durch die Stornierung verursachte Ablehnung in eine Lösung umgewandelt, um die Verwendung von try...catch... zu vermeiden. console.log(result === "ok" ? "OK drücken" : "Abbrechen drücken"); 3.3. Verbessern Sie die Details Es ist etwas unpassend, Aber jetzt verarbeitet asynchrone Funktion showDialog(Inhalt, Titel, Optionen = {}) { ... wenn (Optionen.Typ === "Alarm") { $dialog.find(".abbrechen-button").entfernen(); } ... } Anschließend kann das endgültige showDialog(result === "ok" ? "OK drücken" : "Abbrechen drücken", "Prompt", { type: "alert" }); 3.4. Reform Wenn Sie die Verarbeitungsfunktion nicht in const dialog = showDialog("Hallo, hier ist der Inhalt des Dialogfelds", "Sag Hallo"); // Fügen Sie die Verarbeitungsfunktion in das onOk des Versprechens ein dialog.onOk = () => neues Promise((auflösen) => { setTimeout(auflösen, 3000); }); const Ergebnis = warte auf Dialog.catch(msg => msg); showDialog(result === "ok" ? "OK drücken" : "Abbrechen drücken", "Prompt", { type: "alert" }); Dabei sind einige Dinge zu beachten: Vergessen Sie nicht, Oben finden Sie eine detaillierte Analyse des Beispiels für das asynchrone Verhalten des Popup-Fensters der Front-End-Webseite von vue.js. Weitere Informationen zum asynchronen Popup-Fenster der Front-End-Webseite von vue.js finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Eine großartige Sammlung von Lernressourcen zu Webstandards
NERDTree ist ein Dateisystembrowser für Vim. Mit ...
MySQL-Installationstutorial für Windows-Systeme h...
Verwenden Sie natives JS, um einen einfachen Rech...
Inhaltsverzeichnis 1. Docker installieren 2. Erst...
Es gibt zwei Arten von MySQL-Installationsdateien...
Wenn Sie mit der Arbeit an einem Projekt beginnen...
offizielle Tomcat-Website Tomcat entspricht einem...
1. Im Allgemeinen ist MariaDB in CentOS standardm...
Formatkodierung 1. Bitte stellen Sie die Seitenbr...
1. Technische Punkte Vite-Version vue3 ts Integri...
Nach der Installation von VMware Tools ① kann Tex...
Viele Leute haben mich auch gefragt, welche Büche...
Beim Verwenden der MySql-Fensterfunktion zum Samm...
verwenden Flexible Boxen spielen beim Front-End-L...
Inhaltsverzeichnis Verwenden Sie bidirektionale B...