Über das Problem beim Schreiben von Plugins zum Mounten von DOM in vue3

Über das Problem beim Schreiben von Plugins zum Mounten von DOM in vue3

Im Vergleich zu vue2 verfügt vue3 über ein zusätzliches App-Konzept, und die Erstellung von vue3-Projekten ist ebenfalls

// Haupt.js
importiere { createApp } von 'vue'
App aus „./App.vue“ importieren
Importieren Sie ElementPlus von „element-plus“.

const app = createApp(App)
app.use(ElementPlus) // Verwenden Sie das Ele.me-Framework app.mount('#app')

Daher ist auch Vue.extend weg.

Vue2 erstellt ein Plugin:

Standardfunktion exportieren installieren (Vue) {
  let app = Vue.extend({
    rendern (h) {
      return h('div', {
        Stil: {
          Anzeige: this.isShow ? 'flex' : 'keine'
        }
      })
    }
  })

  let appDom = neue App({
    el: document.createElement('div'),
    Daten: Funktion () {
      zurückkehren {
        isShow: false
      }
    }
  })

  Funktion zeigen () {
    appDom.isShow = true
  }

  Funktion ausblenden () {
    appDom.isShow = false
  }
  Vue.prototype.$show = anzeigen
  Vue.prototype.$hide = ausblenden
  Dokument.Body.AnhängenUntergeordnetesElement(appDom.$el)
}

Vue3 erstellt ein Plugin:

importiere { createApp, h } von 'vue'

exportiere Standardfunktion install (App) {
  let app = erstelleApp({
    Daten() {
      zurückkehren {
        isShow: false,
      }
    },
    rendern() {
      return h('div', {
        Stil: {
          Anzeige: this.isShow ? 'flex' : 'keine'
        }
      })
    }
  })
  
  const vNodeDom = document.createElement('div')
  Dokument.Body.AnhängenUntergeordnetesElement(vNodeDom)
  const vm = app.mount(vNodeDom)

  App.config.globalProperties.$show = Funktion () {
    vm.isShow = true
  }

  App.config.globalProperties.$hide = Funktion () {
    vm.isShow = false
  }
}

Im Vergleich dazu können wir feststellen, dass die DOM-Mounting-Methode von vue3 darin besteht, eine neue App zu erstellen und dann die Methode mount() aufzurufen, um sie in die Seite einzufügen.

Auch die Einbindungsmethode globaler Methoden ändert sich von Vue.prototype von vue2 zu App.config.globalProperties von vue3.

Wenn das Vue3-Plug-In außerdem „createApp“ verwendet, um eine neue DOM-Struktur zu erstellen und in die Seite einzufügen, wird es von der in main.js erstellten App isoliert. Dies bedeutet, dass die in main.js verwendeten Komponenten und öffentlichen Methoden in diesem Plug-In nicht verwendet werden können.

// myCom.vue
<Vorlage>
  <el-button>Schaltfläche</el-button>
</Vorlage>


// myCom.js
importiere { createApp, h } von 'vue'
importiere myCom aus „./myCom.vue“
exportiere Standardfunktion install (App) {
  let app = erstelleApp({
    Daten() {
      zurückkehren {
        isShow: false
      }
    },
    rendern() {
      Rückgabewert h(myCom)
    }
  })

  const vNodeDom = document.createElement('div')
  Dokument.Body.AnhängenUntergeordnetesElement(vNodeDom)
  app.mount(vNodeDom)
}

Im obigen Beispiel kann der el-button nicht normal angezeigt werden und die Konsole meldet einen Fehler:

[Vue warnen]: Komponente konnte nicht aufgelöst werden: el-button

Wenn Sie daher ein neues DOM erstellen und die in main.js global registrierten Komponenten und Methoden verwenden möchten, können Sie createApp nicht verwenden.

Nach Rücksprache mit den Entwicklern von vue3 bin ich zu folgender Lösung gekommen: (Probleme)

importiere { render, h } von 'vue'
importiere myCom aus „./myCom.vue“

exportiere Standardfunktion install (App) {
  sei vNode = h({
    Daten() {
      zurückkehren {
        isShow: false,
      }
    },
    rendern() {
      Rückgabewert h(myCom)
    }
  })

  const vNodeDom = document.createElement('div')
  Dokument.Body.AnhängenUntergeordnetesElement(vNodeDom)
  vNode.appContext = App._context
  rendern(vNode, vNodeDom)

  App.config.globalProperties.$show = Funktion () {
    vNode.component.proxy.isShow = true
  }

  App.config.globalProperties.$hide = Funktion () {
    vNode.component.proxy.isShow = false
  }
}

Dieses Mal wird keine neue App erstellt. Stattdessen wird der Kontext der ursprünglichen App in den vNode kopiert, sodass Komponenten und öffentliche Methoden gemeinsam genutzt werden können.

Der Zugriff auf die neu erstellten Plugin-Eigenschaften und -Methoden erfolgt über vNode.component.proxy.

el-button wird auch korrekt analysiert

Dies ist das Ende dieses Artikels zum Schreiben eines Plug-Ins für Vue3 zum Mounten von DOM. Weitere relevante Inhalte zum Vue-Mounting-DOM-Plug-In finden Sie in früheren Artikeln auf 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:
  • Beispielcode zum Einbinden einer Vue-Komponente in eine globale Methode
  • Vue verwendet JSEncrypt, um RSA-Verschlüsselung und Mounting-Methode zu implementieren
  • Vue.extend implementiert die Methode zum Mounten der Instanz
  • So mounten Sie Objekte und Methoden global in Vue3.0

<<:  Grafisches Tutorial zu MySQL-Downloads und Installationsdetails

>>:  CentOS 7 erstellt Hadoop 2.10 mit hoher Verfügbarkeit (HA)

Artikel empfehlen

Der Unterschied zwischen ${param} und #{param} in MySQL

Der von ${param} übergebene Parameter wird als Te...

js zur Realisierung eines einfachen Puzzlespiels

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

Erstellen einer KVM-Virtualisierungsplattform auf CentOS7 (drei Möglichkeiten)

KVM steht für Kernel-based Virtual Machine und is...

Detaillierte grafische Erklärung der MySQL-Abfragesteuerungsanweisungen

MySQL-Abfrage-Steueranweisungen Felddeduplizierun...

So ändern Sie die Zeitzone und die Uhrzeit im Ubuntu-System

Auf einem Linux-Computer gibt es zwei Zeitzonen: ...

Eine großartige Sammlung von Lernressourcen zu Webstandards

Diese Spezifikationen sollen die Veröffentlichung ...

Beispiel für den Aufbau eines Redis-Sentinel-Clusters basierend auf Docker

1. Übersicht Redis Cluster ermöglicht hohe Verfüg...

So bereinigen Sie Daten in einer MySQL-Onlinedatenbank

Inhaltsverzeichnis 01 Szenarioanalyse 02 Funktion...

JavaScript implementiert eine Warteschlange mit doppeltem Ende

In diesem Artikelbeispiel wird der spezifische Co...