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

Eine kurze Erläuterung der HTML-Tabellen-Tags

Besprechen Sie hauptsächlich seine Struktur und ei...

Installieren Sie Ubuntu 18 ohne USB-Laufwerk unter Windows 10 mit EasyUEFI

1. BIOS überprüfen Überprüfen Sie zunächst, in we...

Detaillierte Erklärung der Rolle von Explain in MySQL

1. MySQL-Index Index: Eine Datenstruktur, die MyS...

Responsive Layout-Zusammenfassung (empfohlen)

Grundkenntnisse der responsiven Layoutentwicklung...

Zusammenfassung der Ereignisbehandlung im Vue.js-Frontend-Framework

1. v-on-Ereignisüberwachung Um DOM-Ereignisse abz...

Über das durch die HTML-Kodierung verursachte verstümmelte Problem

Heute hat ein Student im dritten Studienjahr eine...

Detaillierte Erklärung des Vue-Plugins

Zusammenfassen Dieser Artikel endet hier. Ich hof...

Ungültige Lösung beim Definieren mehrerer Klassenattribute in HTML

Beim Schreiben von HTML definieren wir häufig mehr...

Einrichten eines globalen Shadowsocks+Polipo-Proxys in einer Linux-Umgebung

1. Installieren Sie Shadowsocks sudo apt-get inst...

Installieren von MySQL 8.0.12 basierend auf Windows

Dieses Tutorial ist nur auf Windows-Systemen anwe...