Vue implementiert Modal-Komponente basierend auf Teleport

Vue implementiert Modal-Komponente basierend auf Teleport

1. Lernen Sie Teleport kennen

Wenn wir beispielsweise globale Komponenten wie Modalkomponenten, Nachrichtenkomponenten und Ladekomponenten ohne Teleport schreiben und sie in eine VUE-Datei einfügen, wird ihre HTML-Struktur der Komponentenvorlage hinzugefügt, was nicht perfekt ist.

  • Kein Teleport

  • Teleport

Nachfolgend finden Sie eine praktische Einführung zur Entwicklung modaler Komponenten mit Teleport

2. Grundlegende Verwendung von Teleport

Das Schreiben von Teleport ist sehr einfach. Sie müssen den Inhalt nur mit <Teleport></Teleport> umschließen und angeben, unter welchem ​​übergeordneten Knoten das HTML angehängt werden soll.

<teleportieren nach="#modal">
Inhalt</teleport>

3. Erster Schritt Optimierung

Wenn wir den DOM, den Teleport mounten soll, im Code fest codieren, wird jedes Mal, wenn eine globale Komponente erstellt wird, ein DOM-Knoten benötigt, und es wird immer mehr davon geben, und sie werden immer existieren. Diese Schreibmethode ist nicht sehr elegant. Eine bessere Lösung ist:

  • Erstellen Sie beim Erstellen einer Komponente dynamisch einen DOM-Knoten document.createElement().
  • Und fügen Sie es dem Textkörper hinzu, document.body.appendChild(),
  • Zerstören Sie dieses Dom-Dokument.body.removeChild(), wenn die Komponente deinstalliert wird.
aufstellen(){
  const node = Dokument.createElement('div')
  node.id = "modal"
  Dokument.Body.AppendChild(Knoten)
  beiUnmountet(() => {
    Dokument.Body.RemoveChild(Knoten)
  })
}

4. Zweiter Schritt der Optimierung

Wenn wir in Zukunft Nachrichtenkomponenten, Ladekomponenten und andere Funktionen hinzufügen möchten, müssen wir auch Teleport verwenden. Es ist etwas redundant, einen solchen Codeabschnitt in jede Komponente zu schreiben. Vue3 ermöglicht es uns, die logischen Funktionen einfach zu extrahieren und so den Zweck der Wiederverwendung von Logik zu erreichen.

Wir erstellen die Datei useDOMCreate.ts im Ordner src-hooks, um diese Logik zu kapseln

// hooks/useDOMCreate.ts
importiere { onUnmount } von 'vue'

Funktion useDOMCreate(nodeId:string):void {
  const node = Dokument.createElement('div')
  node.id = Knoten-ID
  Dokument.Body.AppendChild(Knoten)
  beiUnmountet(() => {
    Dokument.Body.RemoveChild(Knoten)
  })
}
Standardmäßig exportieren useDOMCreate

verwenden:

importiere useDOMCreate von '../hooks/useDOMCreate'
setup(Eigenschaften, ctx) {
    useDOMCreate('modal')
}

5. Modalkomponente implementieren

Auf die Einzelheiten der Kapselung der Modalkomponente wird hier nicht näher eingegangen, und es gibt keine komplizierte Logik. Direkt auf dem Code.

//Modal.vue
<Vorlage>
  <teleportieren nach="#modal">
    <div Klasse="modal d-block" tabindex="-1" v-if="isVisible">
      <div Klasse="modal-dialog">
        <div Klasse="modaler Inhalt">
          <div Klasse="modal-header">
            <h5 class="modal-title">{{title}}</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Schließen">
              <span aria-hidden="true" @click="onClose">&times;</span>
            </button>
          </div>
          <div Klasse="modal-body">
            <Steckplatz></Steckplatz>
          </div>
          <div Klasse="modal-footer">
            <button type="button" class="btn btn-secondary" data-dismiss="modal" @click="onClose">Abbrechen</button>
            <button type="button" class="btn btn-primary" @click="onConfirm">Bestätigen</button>
          </div>
        </div>
      </div>
    </div>
  </teleportieren>
</Vorlage>
<script lang="ts">
importiere { defineComponent } von 'vue'
importiere useDOMCreate von '../hooks/useDOMCreate'
exportiere StandarddefiniereKomponente({
  Name: "Modal",
  gibt aus: ['Modell schließen', 'Modell bestätigen'],
  Requisiten: {
    Titel:
      Typ: Zeichenfolge,
      Standard: ''
    },
    istSichtbar: {
      Typ: Boolean,
      Standard: false
    }
  },
  setup(Eigenschaften, ctx) {
    useDOMCreate('modal')
    const onClose = () => {
      ctx.emit('Modell schließen')
    }
    const beiBestätigung = () => {
      ctx.emit('Modell bestätigen')
    }
    zurückkehren {
      beim Schließen,
      beiBestätigen
    }
  }
})
</Skript>

Anwendungsbeispiele

<Vorlage>
  <div Klasse="Beitragsdetailseite">
    <button type="button" class="btn btn-danger" @click="handleDelete">Löschen</button>
    <modal title='Sind Sie sicher, dass Sie löschen möchten? ' :istSichtbar="modalSichtbar" @model-close="handleModalClose" @model-confirm="handleModalConfim">
      <p>Möchten Sie diesen Artikel wirklich löschen? </p>
    </modal>
  </div>
</Vorlage>
<script lang="ts">
importiere { defineComponent, ref } von 'vue'
Modal importieren aus '../components/Modal.vue'

exportiere StandarddefiniereKomponente({
  Name: 'Post-Detail',
  Komponenten: { Modal },
  aufstellen() {
    const modalVisible = ref(false)
    const handleDelete = () => {
      modalVisible.value = true
    }
    const hanldeModalClose = () => {
      modalVisible.value = false
    }
    const handleModalConfim = () => {
      modalVisible.value = false
      ...
     //Anschließende logische Verarbeitung}
    zurückkehren {
      hanldeModalClose,
      handleModalConfim,
      handleDelete,
      modalSichtbar
    }
  }
})
</Skript>

Oben finden Sie Einzelheiten dazu, wie Vue Modalkomponenten basierend auf Teleport implementiert. Weitere Informationen zur Implementierung von Modalkomponenten durch Vue Teleport finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung zur Verwendung von Teleport in Vue3
  • Detaillierte Erklärung zur Verwendung der vue3 Teleport-Sofortbewegungsfunktion
  • Detaillierte Erläuterung der Praxis und des Prinzips von Vue3 Teleport
  • So passen Sie Dialog- und Modalkomponenten in Vue3 an
  • Handgeschriebener Vue-Popup-Fenster-Modal-Implementierungscode
  • Die modale Komponente von iview in der Vue-Komponente hat ein Problem: Ob das Modal angezeigt wird oder nicht, sollte v-show verwenden

<<:  So setzen Sie das Root-Passwort in mysql8.0.12 zurück

>>:  Implementierung des Pycharm-Installationstutorials auf Ubuntu 18.04

Artikel empfehlen

MySQL-Datenbankoptimierung: Indeximplementierungsprinzip und Nutzungsanalyse

Dieser Artikel veranschaulicht anhand von Beispie...

MySQL-Abfrage – Erlernen grundlegender Abfrageoperationen

Vorwort MySQL ist das beliebteste relationale Dat...

Verwendung der hasOwnProperty-Methode des js-Attributobjekts

Die Methode hasOwnProperty() des Objekts gibt ein...

JavaScript zum Erzielen eines Akkordeoneffekts

In diesem Artikel wird der spezifische Code für J...

Grundlegende Schritte zur Verwendung einer Mysql-SSH-Tunnelverbindung

Vorwort Aus Sicherheitsgründen kann sich der Root...

jQuery implementiert einen einfachen Kommentarbereich

In diesem Artikel wird der spezifische Code von j...

Vue verwendet drei Methoden zum Aktualisieren der Seite

Beim Schreiben von Projekten stoßen wir häufig au...

Vue-Router-Verlaufsmodus, serverseitiger Konfigurationsprozess-Datensatz

Geschichtsroute Der Verlaufsmodus bezieht sich au...

Soll die Like-Funktion MySQL oder Redis verwenden?

Inhaltsverzeichnis 1. Häufige Fehler von Anfänger...

Detaillierte Erklärung der MySQL-Datengruppierung

Gruppe erstellen Die Gruppierung wird in der GROU...

Implementierung eines einfachen Timers in JavaScript

In diesem Artikelbeispiel wird der spezifische Ja...