Ü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

Zusammenfassung der Methoden zum Schreiben von Urteilsaussagen in MySQL

So schreiben Sie Urteilsaussagen in MySQL: Method...

Mysql-String-Abfangen und Abrufen von Daten im angegebenen String

Vorwort: Ich bin auf die Anforderung gestoßen, be...

So erlauben Sie den Remotezugriff auf offene Ports in Linux

1. Ändern Sie die Firewall-Konfigurationsdatei # ...

Grundlegender Installationsprozess von mysql5.7.19 unter winx64 (Details)

1. Herunterladen https://dev.mysql.com/downloads/...

CSS3 verwendet Transform, um eine bewegliche 2D-Uhr zu erstellen

Nachdem wir den transform Kurs abgeschlossen habe...

JavaScript imitiert die Spezialeffekte der Jingdong-Lupe

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

Vue implementiert die richtige Slide-Out-Layer-Animation

In diesem Artikelbeispiel wird der spezifische Co...

So fragen Sie einen Datensatz in MySQL ab, auf welcher Seite der Paging-Seite

Vorwort In der Praxis kann es zu folgendem Proble...

Implementierung der Header-Informationen für Nginx-Operationsantworten

Voraussetzung: Sie müssen das Modul ngx_http_head...

Multiservice-Image-Packaging-Vorgang von Dockerfile unter Aufsicht

Schreiben einer Docker-Datei Konfigurieren Sie di...

Natives JS zur Implementierung einer Echtzeituhr

Teilen Sie einen Echtzeituhreffekt, der mit nativ...

Detaillierte Erklärung der Definition und Funktion von Trennzeichen in MySQL

Wenn Sie MySQL zum ersten Mal lernen, verstehen S...