Vue3 implementiert ein Beispiel für eine Nachrichtenkomponente

Vue3 implementiert ein Beispiel für eine Nachrichtenkomponente

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:

  • Müssen häufig eingeführt und registriert werden
  • Sie müssen die Komponente als Tag in der Vorlage verwenden
  • Zur Steuerung der Eigenschaften und des Status von Komponenten sind zusätzliche Parameter erforderlich
  • Der Montageort unfreundlicher benutzerdefinierter Komponenten wird durch andere Komponenten beeinflusst

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>

Nachrichtensymbol

Es 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 an

const 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 definiert

const 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:
  • Vue3 manuelle Kapselung Popup-Box-Komponente Nachrichtenmethode
  • Detaillierte Erläuterung der Vue3-Kapselungsfunktion für Nachrichtenaufforderungsinstanzen
  • Schreiben Sie eine globale Nachrichtenkomponente basierend auf Vue
  • Kapselung und Verwendung von el-message in vue

<<:  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

Artikel empfehlen

Detailliertes Tutorial zum Upgrade von Zabbix Monitoring 4.4 auf 5.0

1. Zabbix-Backup [root@iZ2zeapnvuohe8p14289u6Z /]...

Lösung für das Problem, dass sich der mysql8.0.11-Client nicht anmelden kann

In diesem Artikel erfahren Sie, wie Sie das Probl...

Implementierung des Tomcat-Bereitstellungsprojekts und Integration mit IDEA

Inhaltsverzeichnis 3 Möglichkeiten zum Bereitstel...

Miniprogramm zur Implementierung einer kreisförmigen Text-Scrolling-Animation

In diesem Artikel wird der spezifische Code des A...

Lösen Sie schnell das Problem der chinesischen Eingabemethode unter Linux

Hintergrund: Ich arbeite derzeit an Funktionen fü...

Probleme beim Springen auf HTML-Seiten und bei der Parameterübertragung

HTML-Seitensprung: Fenster.öffnen(URL, "&quo...

Detaillierte Erklärung, wo die von Docker abgerufenen Bilder gespeichert werden

Die vom Docker abgerufenen Befehle werden standar...

Ausführliche Erläuterung zum MySQL-Lernen einer Datenbanksicherung

Inhaltsverzeichnis 1.DB, DBMS, SQL 2. Eigenschaft...

Quellcode der HTML-Einstellungen für die Benutzerregistrierungsseite

Gestalten Sie die oben gezeigte Webseite: <!DOC...