Ü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

Grundlegendes zu MySQL-Sperren basierend auf Update-SQL-Anweisungen

Vorwort Die MySQL-Datenbanksperre ist ein wichtig...

Sprechen Sie über nextTick in Vue

Wenn sich die Daten ändern, wird die DOM-Ansicht ...

Detaillierte Diskussion zum Thema mysqldump-Datenexport

1. Bei der Verwendung von mysqldump wird ein Fehl...

vue + tp5 realisiert eine einfache Anmeldefunktion

In diesem Artikelbeispiel wird der spezifische Co...

Grundlegender JSON-Betriebsleitfaden in MySQL 5.7

Vorwort Aufgrund der Projektanforderungen werden ...

Fünf Möglichkeiten zum automatischen Seitensprung in HTML

Im vorherigen Artikel haben wir drei gängige Meth...

Die Qualitäten und Fähigkeiten, die ein Webdesigner haben sollte

Webdesign ist eine aufstrebende Randbranche, die n...

Methode zur Verhinderung von SSH-Cracking auf Linux-Servern (empfohlen)

1. Der Linux-Server konfiguriert /etc/hosts.deny ...

Zusammenfassung der Methoden zum Einfügen von Videos in HTML-Seiten

Wenn Sie nun das Video-Tag auf einer Seite verwen...

Beispiel für die Implementierung einer To-Do-Anwendung mit Vue

Hintergrund Zunächst möchte ich sagen, dass ich k...

Detaillierte Installation und Konfiguration von hadoop2.7.2 unter Ubuntu15.10

Im Internet und in vielen Büchern gibt es viele T...

Anwendung zur Verarbeitung von HTML-Tag-Überläufen

Verwenden Sie CSS, um Bildlaufleisten zu ändern 1...