In den meisten Webprodukten wird die globale Nachrichtenkomponente häufig in verschiedenen Szenarien verwendet. Sie wird häufig in Szenarien verwendet, in denen Benutzerfeedback gegeben, Informationen angefordert und Dialoge mit dem System geführt werden. Wenn Sie die herkömmliche Methode zum Schreiben von Komponenten verwenden, müssen Sie die Komponente importieren und in Komponenten registrieren, sie dann in der Vorlage als Tag aufrufen, benutzerdefinierte Props-Attribute übergeben und Ereignisse durch Emit auslösen. Dieser Komponententyp hat häufig die folgenden Nachteile:
Daher hoffen wir, dass wir Komponenten wie Message in JavaScript aufrufen und benutzerdefinierte Parameter zur Steuerung des Komponentenstatus übergeben können, ohne die Komponente beim Aufruf manuell am Ende des Textkörpers mounten zu müssen. Wenn Sie gängige Drittanbieterbibliotheken wie ElementUI plus oder Ant Design für Vue verwendet haben, sind Sie mit deren API für Nachrichtenkomponenten vertraut. Als Nächstes verwenden wir Vue3, um eine globale Nachrichtenkomponente zu implementieren. Die endgültige Wirkung der Komponente Komponentendesign Definieren der endgültigen Komponenten-API Implementieren Sie eine einfache Nachrichtenkomponente, einschließlich API-Typen wie Text, Erfolg und Fehler. Sie unterstützt die direkte Übergabe eines Textabschnitts und unterstützt auch die Anpassung des Nachrichteninhalts, der Schließverzögerung und der Anzeige einer Schaltfläche zum Schließen durch komponentenspezifische Optionskonfiguration. // Nachrichtentyp: Text, Erfolg, Fehler ["Text", "Erfolg", "Fehler"] // Nachrichtenoptionen [String]: Nachrichteninhalt [Object]: Nachrichtenkonfiguration // Optionskonfigurationstext [String] "" Nachrichteninhalt Dauer [Zahl] 0 Die Verzögerung in Millisekunden für das automatische Schließen, 0 bedeutet kein automatisches Schließen close [Boolean] false Ob die Schließen-Schaltfläche angezeigt werden soll // Aufrufende Methode Message[type](option); Aufrufbeispiel Message.text("Dies ist eine Nachrichtenaufforderung"); Nachricht.Fehler({ Text: "Netzwerkfehler, bitte versuchen Sie es später noch einmal", Dauer: 3000, schließen: wahr }); Komponentenstruktur definieren Erstellen Sie einen Nachrichtenordner, um die Gesamtstruktur der Komponente zu speichern, wobei src die Vorlagen-, Stil- und Instanzdateien der Komponente enthält. Erstellen Sie auf derselben Ebene index.js, um die gesamte Komponente verfügbar zu machen, damit sie in Projekte und Geschäftskomponenten eingeführt werden kann. |--- Nachricht |--- Quelle | |--- Message.vue // Komponentenvorlage| |--- Message.less // Unterstützung für Komponentenstil bereitstellen| |--- Message.js // Konfiguration lesen und Komponenteninstanz rendern| |--- Instance.js // Komponenteninstanz|---index.js // Komponente verfügbar machen Vorlagen und Stile Vorlage Die Vorlage ist relativ einfach. Die äußere Ebene ist mit Animationskomponenten umhüllt und v-show wird verwendet, um die Anzeige und das Schließen von Nachrichten zu steuern. Der Inhalt umfasst Symbole, Nachrichtentext und eine konfigurierbare manuelle Schaltfläche zum Schließen. <Vorlage> <!-- Nachrichtenliste--> <Übergangsname="Folie-Überblendung"> <div Klasse="Nachrichtencontainer" v-show="sichtbar"> <!-- Inhalt --> <div Klasse="Nachrichteninhalt"> <!-- Nachrichtentypsymbol, wird durch den Nachrichtentyp bestimmt, für den Texttyp wird kein Symbol konfiguriert--> <div Klasse="Nachrichtensymbol" v-if="config.icon"> <i: class="Konfigurationssymbol"></i> </div> <!-- Nachrichtentext --> <span v-text="konfiguration.inhalt"></span> <!-- Nachricht manuell schließen --> <div Klasse="Option" v-if="!config.close"> <i class="ri-close-fill" @click="onClose"></i> </div> </div> </div> </Übergang> </Vorlage> NachrichtensymbolEs ist zu beachten, dass das Symbol durch den Typ im API-Aufruf bestimmt wird. Der Symboltyp wird beim Erstellen der Instanz bestimmt. Hier wird auf die Open-Source-Symbolbibliothek Remix Icon verwiesen. Die spezifische Referenzmethode wird hier nicht beschrieben. Die Adresse lautet: remixicon.cn/ Stil Definieren Sie Stile und Animationen in Message.less. @Radius: 4px; @normalHeight: 34px; .Nachricht { Position: fest; oben: 0; links: 0; Breite: 100 %; Textausrichtung: zentriert; Box-Größe: Rahmenbox; Z-Index: 9999; transformieren: übersetzenZ(9999px); Polsterung oben: 28px; Übergang: oben 0,4 Sekunden Leichtigkeit; .Nachrichtencontainer { Rand unten: 14px; .Nachrichtensymbol { Anzeige: Inline-Block; ich { Schriftgröße: 18px; Schriftstärke: 400; Rand oben: -3px; Rand rechts: 6px; Anzeige: Inline-Block; Box-Größe: Rahmenbox; vertikale Ausrichtung: Mitte; } .ri-checkbox-circle-fill { Farbe: #58c05b; } .ri-close-circle-fill { Farbe: #fd4f4d; } .Nachrichteninhalt { Anzeige: Inline-Block; Polsterung: 4px 18px; Höhe: @normalHeight; Textausrichtung: links; Zeilenhöhe: @normalHeight; Schriftgröße: 14px; Schriftstärke: 400; Rahmenradius: @radius; Farbe: #595959; Kastenschatten: 0 4px 12px rgba (0, 0, 0, .15); Hintergrund: #ffffff; .option { Anzeige: Inline-Block; Zeigerereignisse: alle; Rand links: 18px; ich { Schriftgröße: 18px; Schriftstärke: 400; Rand oben: -3px; Anzeige: Inline-Block; Box-Größe: Rahmenbox; vertikale Ausrichtung: Mitte; Cursor: Zeiger; Farbe: #d9d9d9; Übergang: Farbe, 0,2 s langsam; &:schweben { Farbe: #ff7c75; Übergang: Farbe, 0,2 s langsam; } } } } } .slide-fade-enter-active { Übergang: alle 0,2 s Auslaufen; } .slide-fade-leave-active { Übergang: alle 0,2 Sekunden leicht; } .schieben-ausblenden-eingeben-von, .slide-fade-leave-to { transformieren: übersetzenY(-20px); Deckkraft: 0; } } Komponentenskripte In der Komponente werden das Rendern und das Unmounten durch Abrufen und Entfernen der übergebenen Konfigurationskonfiguration erreicht, und das Öffnen und manuelle Schließen von Nachrichten wird durch die Methoden onOpen und onClose gesteuert. Der spezifische Code lautet wie folgt: <Skript> importiere { reaktiv, toRefs } von "vue"; Standard exportieren { Requisiten: { config: { Typ: Objekt, Standard: () => {} }, // Nachrichtenkonfigurationselement entfernen: { Typ: Funktion, Standard: () => {} }, // Mount-Callback abbrechen }, setup(Requisiten) { const state = reaktiv({ sichtbar: falsch, }) // Nachricht öffnen const onOpen = (config) => { setzeTimeout(() => { Zustand.sichtbar = wahr; }, 10) // Nachricht nach einer angegebenen Zeit entfernen if (config.duration !== 0) { setzeTimeout(() => { beimSchließen(); }, Konfigurationsdauer); } } beim Öffnen(props.config) //Nachricht schließen const onClose = () => { Zustand.sichtbar = falsch; setzeTimeout(() => { Eigenschaften.entfernen() }, 200) }; zurückkehren { …toRefs(Zustand), beim Öffnen, beim Schließen, }; }, }; </Skript> Erstellen einer Komponenteninstanz Als Nächstes schreiben wir die APIs zum Erstellen, Mounten und Löschen von Komponenten beim Aufrufen von Komponenten in Instance.js. Der Header stellt die Instanzerstellungsmethode von Vue und die oben beschriebene Komponentenvorlage vor: importiere { createApp } von 'vue' Nachricht aus „./Message.vue“ importieren Deklarieren Sie eine Instanzoperationsmethode, die einen Nachrichtenkonfigurationsparameter akzeptiert cfg /** * Nachrichteninstanzvorgang * @param {Object} cfg-Instanzkonfiguration */ const createInstance = cfg => { const config = cfg || {} // 1. Erzeugen Sie einen Paketcontainer und legen Sie das äußere Klassenattribut und die Nachrichtenanzahl fest. // 2. Erzeugen Sie eine Instanz und hängen Sie diese in den Body ein. // 3. Implementieren Sie die Methode zum Abbrechen des Mountens und zum Neustarten der Zählung nach dem Abbrechen des Mountens} Standardmäßig exportieren: Instanz erstellen 1. Erstellen Sie einen Wrapper-Container und legen Sie die äußere Klasseneigenschaft fest Erstellen Sie ein DIV als äußeren Container, um die Komponente zu umschließen, und legen Sie das entsprechende Klassenattribut fest let messageNode = document.createElement('div') let attr = document.createAttribute("Klasse") attr.value = "Nachricht" messageNode.setAttributeNode(attr) Nachrichtenanzahl: Wir definieren die Höhe eines Nachrichten-Popup-Fensters als 54 px. Wenn mehrere Nachrichten in die Warteschlange gestellt und geöffnet werden, werden die Komponenten durch Festlegen des oberen Werts gestaffelt. const height = 54 // Höhe eines einzelnen Nachrichtenfelds const messageList = document.getElementsByClassName('message') messageNode.style.top = `${messageList.length * Höhe}px` 2. Erstellen Sie eine Instanz und hängen Sie sie an den Körper anconst app = createApp(Nachricht, { Konfiguration, entfernen() { handleRemove()//Entfernen Sie das Element. Nachdem die Nachricht geschlossen wurde, heben Sie die Bereitstellung auf und entfernen Sie es aus dem Dom.} }) // Mounten Sie die Instanz und hängen Sie sie an das Ende des Textkörpers an. app.vm = app.mount(messageNode) Dokument.Body.AnhängenUntergeordnetesElement(messageNode) app.schließen = () => { handleEntfernen() } Rückgabe-App 3. Die Methode zum Abbrechen der Bereitstellung und zum Zurücksetzen des oberen Wertes ist definiertconst handleRemove = ()=>{ app.unmount(Nachrichtenknoten) Dokument.Body.RemoveChild(Nachrichtenknoten) ResetMsgTop() } const resetMsgTop = () => { für (lass i = 0; i < Nachrichtenliste.Länge; i++) { Nachrichtenliste[i].style.top = `${i * Höhe}px` } } Implementieren der Rendering Instance-API Verwenden Sie Message.js, um die Konfiguration zu lesen und zu rendern. importiere createInstance aus „./Instance.js“ /** * Konfiguration lesen und Nachricht rendern * @param {Object} typeCfg Typkonfiguration * @param {Object/String} cfg benutzerdefinierte Konfiguration */ Funktion renderMsg(typeCfg = {}, cfg = '') { // Ermöglicht die direkte Übergabe des Nachrichteninhalts, daher muss der Typ der übergebenen CFG bestimmt werden const isContent = typeof cfg === 'string' // Benutzerdefinierte Konfiguration integrieren cfg = isContent ? { Inhalt: cfg } : cfg const config = Object.assign({}, typeCfg, cfg) // Konfiguration zusammenführen const { Typ = 'Text', // Nachrichtentyp Inhalt = '', // Nachrichteninhalt Dauer = 3000, // automatische Schließverzögerungszeit schließen = false // ob die Schaltfläche „Schließen“ angezeigt werden soll } = config // Eine Instanz erstellen return createInstance({ Typ, Inhalt, Dauer, schließen }) } Text, Erfolg, Fehler und andere APIs offenlegen. Standard exportieren { // Nur-Text-Nachricht text(cfg = "") { const textCfg = { Typ: "Text", Symbol: '' } gibt RenderMsg zurück (TextCfg, CFG); }, // Erfolgsaufforderung success(cfg = "") { const ErfolgCfg = { Typ: „Erfolg“, Symbol: „ri-checkbox-circle-fill“ } gibt RenderMsg zurück (ErfolgsCfg, cfg); }, // Fehlermeldung error(cfg = "") { const FehlerCfg = { Typ: "Fehler", Symbol: „ri-Kreis schließen-füllen“ } gibt RenderMsg zurück (FehlerCfg, cfg); }, } Zum Abschluss öffnen Sie diese Komponente in der äußersten index.js zum Aufruf. Nachricht aus „./src/Message.js“ importieren; Standardnachricht exportieren; Dies ist das Ende dieses Artikels über die Implementierung des Nachrichtenkomponentenbeispiels durch Vue3. Weitere verwandte Inhalte zur Vue3-Nachrichtenkomponente finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Mysql-Methode zum Kopieren einer Datenspalte einer Tabelle in eine Spalte einer anderen Tabelle
>>: Der einfachste Weg, ein Programm beim Start in Linux automatisch auszuführen
Zusammenfassung der allgemeinen Funktionen von re...
1. Zabbix-Backup [root@iZ2zeapnvuohe8p14289u6Z /]...
1. Hintergrund Im Allgemeinen verwenden wir für D...
Symptome: Nach dem Hinzufügen des Parameters -v z...
In diesem Artikel erfahren Sie, wie Sie das Probl...
Inhaltsverzeichnis 3 Möglichkeiten zum Bereitstel...
Vorwort Jedes Mal, wenn Sie Docker verwenden, um ...
In diesem Artikel wird der spezifische Code des A...
Hintergrund: Ich arbeite derzeit an Funktionen fü...
HTML-Seitensprung: Fenster.öffnen(URL, "&quo...
Die vom Docker abgerufenen Befehle werden standar...
Inhaltsverzeichnis 1.DB, DBMS, SQL 2. Eigenschaft...
Unten sehen Sie den Code, den Shiji Tiancheng ver...
Das Auswahlelement erstellt ein Einzelauswahl- ode...
Gestalten Sie die oben gezeigte Webseite: <!DOC...