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

Beispiel für die Bereitstellung einer Laravel-Anwendung mit Docker

Das in diesem Artikel verwendete PHP-Basisimage i...

So erhalten Sie die dynamische Anzahl der verbleibenden Wörter im Textbereich

Ich bin bei der Arbeit auf einen Fall gestoßen, ü...

Vue-Tutorial zur erweiterten Verwendung dynamischer Komponenten

Inhaltsverzeichnis Grundlegende Beschreibung AST-...

Lösung für die verstümmelte Anzeige von Linux SecureCRT

Sehen wir uns die Situation an, in der SecureCRT ...

MySQL InnoDB-Überwachung (Systemebene, Datenbankebene)

MySQL InnoDB-Überwachung (Systemebene, Datenbanke...

React+Koa-Beispiel zur Implementierung des Datei-Uploads

Inhaltsverzeichnis Hintergrund Serverabhängigkeit...

So verwenden Sie JSX in Vue

Was ist JSX JSX ist eine Syntaxerweiterung von Ja...

Detaillierte Erklärung der Beziehung zwischen React und Redux

Inhaltsverzeichnis 1. Die Beziehung zwischen Redu...

Problemlösungsvorgänge für Alpine Docker-Bildschriftarten

1. Führen Sie Schriftarten aus, öffnen Sie den Sc...

Detaillierte Erläuterung der Mysql-Funktionsaufrufoptimierung

Inhaltsverzeichnis Funktionsaufrufoptimierung Fun...