Vue implementiert Dialogkapselung

Vue implementiert Dialogkapselung

Ein häufiges Szenario beim Schreiben von Geschäftstexten ist, dass Sie dasselbe Formular auf verschiedenen Seiten aufrufen müssen. Die übliche Interaktion besteht darin, das Formular in Form eines Popup-Fensters anzuzeigen. Manchmal ist es jedoch mühsam, die Formularkomponente auf jeder Seite wiederholt einzuführen.

Es gibt zwei Lösungen:

  1. Führen Sie dynamische Komponenten in die Stammkomponente ein und steuern Sie die Anzeigeform dynamischer Komponenten über this.$root.openDialog(name, props) im Geschäft
  2. Kapseln Sie es in ein aufzurufendes Plug-In ein, etwa so: $dialog('EditDialog.vue', props)

Natürlich muss die Business-Dialogkomponente eine Reihe von Spezifikationen haben. Props empfängt einen onOk- und onCancel-Rückruf und definiert eine sichtbare Eigenschaft in den Daten.

<Vorlage>
  <el-dialog :title="Titel" :visible.sync="sichtbar" an Text anhängen>
    <!-- Geschäftscode -->
  </el-dialog>
</Vorlage>

<Skript>
Standard exportieren {
  props: ['onOk', 'Andere vom Unternehmen benötigte Eigenschaften'],
  Daten() {
    zurückkehren {
      sichtbar: false
    }
  }
}
</Skript>

Vue2-Schreiben

Ich persönlich finde, dass es in Vue2 einfacher ist, es als Plug-In zu schreiben. Die Implementierung ist wie folgt. Einige Vorgänge werden mithilfe von Mixins ausgeführt, um es vom Geschäft zu entkoppeln.

Der Nachteil besteht darin, dass die Komponente dynamisch eingefügt wird und Vue Devtools aktualisiert werden muss, um die Komponente anzuzeigen.

konstanter Mixin = {
  montiert() {
    Dokument.Body.AnhängenKind(dies.$el)
    dies.sichtbar = wahr
  },
  betrachten:
    sichtbar(Wert) {
      // Zerstöre die Instanz, nachdem die Animation endet if (value === false) {
        setzeTimeout(() => {
          dies.$zerstören()
          wenn (dies.$el && dies.$el.parentNode) {
            dies.$el.parentNode.removeChild(dies.$el)
          }
        }, 400)
      }
    }
  }
}

Standard exportieren {
  installieren(Vue, Optionen) {
    Vue.prototype.$dialog = (Name, Eigenschaften) => {
      // Relativ zum Speicherort des Plugins wird import('../components/dialogs/' + name) während der statischen Kompilierung überprüft
        .dann(Modul => {
          const-Komponente = Modul.Standard
          const mixins = Komponente.mixins || []
          mixins.push(mixin) // Automatisch öffnen, Lebenszyklusfunktionen und Zerstörungsvorgänge dynamisch einmischen component.mixins = mixins
          gibt Vue.extend(Komponente) zurück
        })
        .then(Dialog => {
          const dialog = neuer Dialog({
            propsData: Requisiten || {}
          })
          dialog.$mount()
        })
    }
  }
}

Die aufrufende Methode ist wie folgt. Beachten Sie, dass der this-Zeiger des onOk-Rückrufs durch die Verwendung einer Pfeilfunktion vermieden werden kann.

dies.$dialog('GroupEdit.vue', {
  Typ: 'Bearbeiten',
  Gruppe: {},
  beiOk: () => {
    diese.freshList()
  }
})

Schreiben der Vue3-Plugin-Version

Leider sind aufgrund des Upgrades von Vue3 Vue.extend und $mount verschwunden und Komponenten können nur in der Anwendung gerendert werden.

Da die Daten zwischen den einzelnen Anwendungen isoliert sind, müssen Plug-Ins und Ähnliches erneut eingeführt werden. Gleichzeitig ist es auch problematisch, wenn Sie interagieren möchten. Es sollte möglich sein, dieselbe Vuex-Instanz einzuführen, aber ich habe es nicht ausprobiert.

Um die Kopplung zu reduzieren, können Sie nur eine neue Anwendung erstellen, um das Rendering zu mounten

importiere { createApp, defineComponent } aus 'vue'
Importieren Sie ElementPlus von „element-plus“.

konstanter Mixin = {
  montiert() {
    Dokument.Body.AnhängenKind(dies.$el)
    dies.sichtbar = wahr
  },
  betrachten:
    sichtbar(Wert) {
      // Zerstöre die Instanz, nachdem die Animation endet if (value === false) {
        setzeTimeout(() => {
          dies.$.appContext.app.unmount()
        }, 400)
      }
    }
  }
}

Standard exportieren {
  installieren(App) {
    app.config.globalProperties.$dialog = (Name, Eigenschaften) => {
      importiere('../Komponenten/Dialogfelder/' + Name)
        .dann(Modul => {
          const-Komponente = Modul.Standard
          let mixins = Komponente.mixins || []
          mixins.push(mixin)
          Komponente.mixins = Mixins

          returniere defineComponent(Komponente).
        })
        .then(Dialog => {
          const app = createApp(Dialog, props || {})
          app.use(ElementPlus)
          app.mount(Dokument.ErstellenElement('div'))
        })
    }
  }
}

Dynamisches Schreiben von Vue3-Komponenten

In Vue3 erfüllt die Plug-In-Version auch die Anforderungen, es handelt sich jedoch um eine völlig neue Anwendung. Der Zugriff auf this.$root, vuex und router im Unternehmen ist immer noch etwas mühsam.

Daher sind dynamische Komponenten in Vue3 besser.

Führen Sie eine dynamische Komponente in die Stammkomponente ein und definieren Sie einige Steuervariablen

<Vorlage>
  <Router-Ansicht></Router-Ansicht>
  <Komponente: ist = "currentDialog" v-bind = "currentDialogProps" />
</Vorlage>

<Skript>
Standard exportieren {
  Daten() {
    zurückkehren {
      currentDialog: null,
      currentDialogProps: null
    }
  }
}
</Skript>

Wenn Sie this.$root.$dialog() aufrufen, sieht es zu hässlich aus. Tatsächlich können Sie die Wirkung des Plug-Ins immer noch manuell simulieren.

const app = createApp(App)
const vm = app.mount('#app')

initDialog(app, vm)

Funktion initDialog(App, VM) {
  konstanter Mixin = {
    montiert() {
      dies.sichtbar = wahr
    },
    betrachten:
      sichtbar(Wert) {
        // Zerstöre die Instanz, nachdem die Animation endet if (value === false) {
          setzeTimeout(() => {
            this.$root.currentDialog = null
            dies.$root.currentDialogProps = {}
          }, 400)
        }
      }
    }
  }

  app.config.globalProperties.$dialog = (Name, Eigenschaften) => {
    importiere('./components/dialogs/' + name).then(module => {
      const-Komponente = Modul.Standard
      let mixins = Komponente.mixins || []
      mixins.push(mixin)
      Komponente.mixins = Mixins
      // defineComponent(component) wird nicht benötigt
      vm.currentDialog = markRaw(Komponente)
      vm.currentDialogProps = markRaw(props || {})
    })
  }
}

Einige Hacks zum Schreiben

Die Vue3-Komponenteninstanz erhält die Anwendungsinstanz

vm.$.appContext.app == app

Die Vue3-Anwendungsinstanz ruft die Komponenteninstanz ab. Beachten Sie, dass _instance nur in der Entwicklungsumgebung zugänglich ist.

app._instance.proxy == vm
app._instance.root.proxy == vm
app._instance.ctx.$root == vm

Es gibt zwar noch einige Tricks, diese sollte man aber besser nicht anwenden.

const app = createApp(App)
const vm = app.mount('#app')

wenn (Prozess.Umgebung.NODE_ENV === 'Produktion') {
  app._instance = {
    Proxy: VM,
    Wurzel: {
      Proxy: vm
    },
    ctx: {
      $root:vm
    }
  }
}

Dies ist das Ende dieses Artikels über die Implementierung der Dialogkapselung durch Vue. Weitere relevante Inhalte zur Dialogkapselung durch Vue 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:
  • Detaillierte Erklärung zur Kapselung von Dialogkomponenten in Vue+Element-UI-Projekten
  • Detaillierte Erläuterung des Prozesses zur Kapselung einer benutzerfreundlicheren Dialogkomponente

<<:  Implementierung von Linux-Dateisystemvorgängen

>>:  Mysql-Fehler: Lösung für zu viele Verbindungen

Artikel empfehlen

Zusammenfassung der Verwendung von Linux-SFTP-Befehlen

sftp ist die Abkürzung für Secure File Transfer P...

CSS3-Übergang zum Erreichen des unterstrichenen Beispielcodes

In diesem Artikel wird der Beispielcode für den C...

Beschreiben Sie kurz die vier Transaktionsisolationsebenen von MySql

Isolationsstufe: Isolation ist komplizierter als ...

Mehrere Implementierungsmethoden der Tab-Leiste (empfohlen)

Registerkarten: Kategorie + Beschreibung Tag-Leis...

So konfigurieren Sie zwei oder mehr Sites mit dem Apache-Webserver

So hosten Sie zwei oder mehr Sites auf dem belieb...

Detaillierte Schritte zum Einrichten eines Nexus-Servers

1. Die Bedeutung des Aufbaus eines Nexus-Dienstes...

Hbase – Erste Schritte

1. HBase-Übersicht 1.1 Was ist HBase? HBase ist e...

Analyse der Lösung für das Problem der gemeinsamen Nutzung von Nginx-Sitzungen

Dieser Artikel stellt hauptsächlich die Lösung fü...

Sind Sie immer noch Select *?

Es gibt viele Gründe, warum eine Anwendung langsa...

So installieren Sie die MySQL 8.0-Datenbank auf dem M1-Chip (Bild und Text)

1. Herunterladen Zunächst möchte ich einen inländ...

Detaillierte Erläuterung der Angular-Strukturdirektivenmodule und -Stile

Inhaltsverzeichnis 1. Strukturelle Anweisungen Mo...

JS erhält Fünf-Sterne-Lob

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

So können Sie lange Vue-Listen schnell laden

Inhaltsverzeichnis Hintergrund Hauptinhalt 1. Kom...