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

Beispielcode zur Implementierung von Dreiecken und Pfeilen durch CSS-Rahmen

1. CSS-Boxmodell Die Box beinhaltet: Rand, Rahmen...

MySQL 5.7.20 Green Edition Installation Detailliertes grafisches Tutorial

Lassen Sie uns zunächst verstehen, was MySQL ist....

Verwendung von Vue-Filtern und benutzerdefinierten Anweisungen

Inhaltsverzeichnis Filter 01.Was ist 02. Wie es g...

So implementieren Sie ein responsives Layout mit CSS

Implementieren eines responsiven Layouts mit CSS ...

JavaScript zum Erzielen eines einfachen Lupeneffekts

In einem großen Kästchen befindet sich ein Bild. ...

MySQL-Datenbank muss SQL-Anweisungen kennen (erweiterte Version)

Dies ist eine erweiterte Version. Die Fragen und ...

Detaillierte Erklärung zur Verwendung der Vue.js-Renderfunktion

Vue empfiehlt in den meisten Fällen die Verwendun...

So installieren Sie Theano und Keras auf einem Ubuntu-System

Hinweis: Das System ist Ubuntu 14.04LTS, ein 32-B...

Tutorial zum Bereitstellen von JDK und Tomcat auf CentOS7 ohne Schnittstelle

1. Installieren Sie xshell6 2. Stellen Sie eine S...

MySQL 8.0.16 Installations- und Konfigurations-Tutorial unter Windows 10

In diesem Artikel finden Sie das grafische Tutori...

So installieren Sie eine virtuelle Maschine mit Windows-Diensten auf dem Mac

1. Laden Sie die virtuelle Maschine herunter Offi...

Zusammenfassung der Erfahrungen mit der Web-Frontend-Entwicklung

XML-Dateien sollten so weit wie möglich in UTF-8 ...