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

Tutorial zur Installation von MySQL 5.6 auf CentOS 6.5

1. Laden Sie das RPM-Paket für Linux herunter htt...

Wie CSS die Zeit des weißen Bildschirms während des ersten Ladens beeinflusst

Rendering-Pipeline mit externen CSS-Dateien In de...

Beispiel zum Entfernen eines JSON-Backslashs in PHP

1. Entfernen Sie Backslashes mit der Methode „str...

HTML-Tabellen-Tag-Tutorial (33): Attribut für vertikale Zellenausrichtung VALIGN

In vertikaler Richtung können Sie die Zellenausri...

Natives JS zur Implementierung eines atmenden Karussells

Heute zeige ich Ihnen ein mit nativem JS implemen...

JavaScript zur einfachen Verknüpfung von Provinzen und Gemeinden

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

Ausführliche Erläuterung der Standortpriorität von Nginx

Standortausdruckstyp ~ bedeutet, dass ein regulär...

Tutorial zu HTML-Tabellen-Tags (34): Zeilenspannen-Attribut ROWSPAN

In einer komplexen Tabellenstruktur erstrecken si...

Navicat für MySQL 11 Registrierungscode\Aktivierungscode-Zusammenfassung

Lesetipp: Navicat12.1 Serie Cracking und Aktivier...

Detaillierte Erklärung zur Verwendung der Element-el-button-Button-Komponente

1. Hintergrund Schaltflächen werden sehr häufig v...

Interviewer stellen häufig Fragen zum Lebenszyklus von React

React-Lebenszyklus Zwei Bilder zum besseren Verst...