Wie werden Vue-Komponenten analysiert und gerendert?

Wie werden Vue-Komponenten analysiert und gerendert?

Vorwort

In diesem Artikel wird erklärt, wie Vue-Komponenten analysiert und gerendert werden.

Wir können globale Komponenten über Vue.component registrieren und sie dann in Vorlagen verwenden

<div id="app">
  <meine-Schaltfläche></meine-Schaltfläche>
</div>
<Skript>
 Vue.component("mein-Button", {
    Vorlage: "<button>Schaltflächenkomponente</button>",
   });
lass vm = neues Vue({
	el:'#app'
});
</Skript>

Prinzip der globalen Komponentenanalyse

Um die Isolierung der Komponenten sicherzustellen, generiert jede Komponente über die Extend-Methode eine neue Klasse, um die übergeordnete Klasse zu erben. Und führen Sie die vom Benutzer über die Methode Vue.component übergebenen Optionen in vue.options.components zusammen. Führen Sie dann beim Initialisieren von Vue Vue.options.components und vm.$options.components zusammen.

1. Vue.component-Methode

Vue.options._base = Vue; //Sie können Vue über \_base finden
Vue.options.components = {}; 

Vue.component = Funktion (ID, Definition) {
  //Jede Komponente generiert eine neue Klasse, um die Vaterdefinition zu erben = this.options._base.extend(definition);

  console.log("1. Erstellen Sie einen Konstruktor für die Komponente, basierend auf Vue", Definition);

  diese.Optionen.Komponenten[id] = Definition;
 };

2. Vue.extend-Methode

Die Extend-Methode generiert eine Klasse, die von Vue erbt und alle Funktionen der übergeordneten Klasse haben sollte.

importiere {mergeOptions} von '../util/index'
Vue.extend = Funktion (Definition) {
  const Vue = dies;
  const Sub = Funktion VueComponent(Optionen) {
   this._init(Optionen);
  };
  Sub.prototype = Objekt.erstellen(Vue.prototype);
  Sub.prototype.constructor = Sub;
  Untergeordnete Optionen = mergeOptions(Vue.Optionen, Definition); 
  Sub zurückgeben;
 };

3. Zusammenführen von Attributen

Füge die von Vue.options und Vue.component(definition) übergebene Definition zusammen.

strats.components = Funktion (Elternwert, Kindwert) {
 let Optionen = Objekt.erstellen(parentVal);
 wenn (Kindwert) {
  für (let key in childVal) {
   Optionen[Schlüssel] = ChildVal[Schlüssel];
  }
 }
 Rückgabemöglichkeiten;
};

4. Initialisieren Sie die Zusammenführung

Vue.options.components und vm.$options.components zusammenführen

 Vue.prototype._init = Funktion (Optionen) {
  const vm = dies;
 ++ vm.$options = mergeOptions(vm.constructor.options, options); 
  //...
  : Der initState(vm);
  wenn (vm.$options.el) {
   //Daten auf dieser Vorlage mounten vm.$mount(vm.$options.el);
  }
 };

Okay, hier haben wir das Parsen globaler Komponenten implementiert.

Schauen wir uns als Nächstes an, wie die Kang Kang-Komponente gerendert wird.

Prinzip der Komponentendarstellung

Beim Erstellen eines virtuellen Knotens müssen wir isReservedTag verwenden, um zu bestimmen, ob das aktuelle Tag eine Komponente ist. Der virtuelle Knoten eines allgemeinen Tags unterscheidet sich vom virtuellen Knoten einer Komponente. Wenn das Tag eine Komponente ist, sollte ein Komponenten-V-Knoten gerendert werden.

Exportfunktion isReservedTag(str) {
 let reservedTag = "a,div,span,p,img,button,ul,li";
 gibt reserviertesTag.includes(str) zurück;
}

1. Erstellen Sie virtuelle Komponentenknoten

createComponent erstellt einen virtuellen Knoten einer Komponente und unterscheidet, ob es sich um eine Komponente handelt, indem ein Hook für die Daten vorhanden ist

Exportfunktion createElement(vm, tag, data = {}, ...children) {
  // Wenn das Tag eine Komponente ist, sollte es den Vnode einer Komponente rendern
  if (isReservedTag(tag)) {
    returniere vnode(vm, Tag, Daten, Daten.Schlüssel, untergeordnete Elemente, undefiniert);
  } anders {
    const Ctor = vm.$options.components[tag]
    returniere createComponent(vm, tag, data, data.key, children, Ctor);
  }
}
//Erstelle einen virtuellen Knoten für die Komponente, um zwischen Komponenten und Elementen zu unterscheiden data.hook 
Funktion createComponent(vm, tag, data, key, children, Ctor) {
  // Komponentenkonstruktor if (isObject (Ctor)) {
    Ctor = vm.$options._base.extend(Ctor); // Vue.extend 
  }
  data.hook = { // Diese Initialisierungsmethode muss beim Rendern der Komponente aufgerufen werden init(vnode){
      let vm = vnode.componentInstance = new Ctor({_isComponent:true}); // new Sub verwendet diese Option und Komponentenkonfiguration zum Zusammenführen von vm.$mount(); // Nachdem die Komponente gemountet wurde, befindet sie sich in vnode.componentInstance.$el 
    }
  }
  returniere vnode(vm, `vue-component-${tag}`, Daten, Schlüssel, undefiniert, undefiniert, {Ctor, untergeordnete Elemente})
}

2. Erstellen Sie den eigentlichen Knoten der Komponente

typeof-Tag === „String“, es kann ein virtueller Knoten einer Komponente sein, dann wird „createComponent“ aufgerufen.

Exportfunktion Patch (alter V-Knoten, V-Knoten) {
  // 1. Bestimmen Sie, ob aktualisiert oder gerendert werden soll, if(!oldVnode){
    gibt createElm(vnode) zurück;
  }anders{
    // ...
  }
}

Funktion createElm(vnode) {
 let { tag, daten, untergeordnete Elemente, Text, vm } = vnode;
 wenn (Typ des Tags === "Zeichenfolge") {
  wenn (createComponent(vnode)) {
   //Gibt den realen Knoten zurück, der der Komponente entspricht return vnode.componentInstance.$el;
  }
  vnode.el = document.createElement(tag); // Der virtuelle Knoten hat ein el-Attribut, das dem realen Knoten entspricht children.forEach((child) => {
   vnode.el.appendChild(createElm(Kind));
  });
 } anders {
  vnode.el = document.createTextNode(text);
 }
 vnode.el zurückgeben;
}

createComponent bestimmt, ob die Komponente ein virtueller Knoten ist, indem es eine hook.init-Methode für die Daten gibt

Wenn ja, rufen Sie data.hook.init für die Komponente auf.

Erstellen Sie eine Komponenteninstanz und weisen Sie sie vnode.componentInstance zu

Wenn vnode.componentInstance einen Wert hat, bedeutet dies, dass der echte DOM der entsprechenden Komponente generiert wurde.

Funktion Komponente erstellen(vnode) {
  sei i = vnode.data;
  wenn((i = i.hook) && (i = i.init)){
    i(v-Knoten);
  }
  wenn(vnode.componentInstance){
    gibt true zurück;
  }
}

Rufen Sie die Init-Methode auf, um eine Instanz der Komponente zu erstellen und sie zu mounten.

Daten.hook = {
  init(vnode){
    let child = vnode.componentInstance = neuer Ctor({});
    child.$mount(); // Komponentenmontage}
}

Zusammenfassung

Neue Komponente (). $mount () => vm. $el

Fügen Sie das $el der Komponente in den übergeordneten Container (übergeordnete Komponente) ein.

Es ist geschafft!

So werden Vue-Komponenten analysiert und gerendert. Weitere Einzelheiten zum Parsen und Rendern von Vue-Komponenten finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Tiefgreifendes Verständnis der dynamischen und asynchronen Komponenten von Vue
  • Schritte für Vue zur Verwendung von Ref, um Komponenten über Ebenen hinweg zu erhalten
  • Vue implementiert Multi-Tab-Komponente
  • Einfaches Anwendungsbeispiel für eine rekursive Vue-Komponente
  • Vue implementiert eine Eingabekomponente, die den Tastenkombinationseffekt der Tastenanzeige erhält
  • Beispiel für die Kommunikation zwischen übergeordneten und untergeordneten Komponenten von Vue (props, $ref, $emit)
  • Verwendung von Vue-montierten Komponenten
  • Wie verweist Vue auf andere Komponenten (CSS und JS)
  • Popup-Layer-Komponente von Vue-Dialog
  • Zusammenfassung der Grundlagen der Vue-Komponenten

<<:  Vue implementiert eine Eingabekomponente, die den Tastenkombinationseffekt der Tastenanzeige erhält

>>:  Java-Beispielcode zum Generieren von zufälligen Zeichen

Artikel empfehlen

Detaillierte Erläuterung von acht Methoden zum Korrigieren des CSS-Seitenendes

Beim Schreiben einer Seite kommt es häufig vor, d...

MySQL 8.0-Installationstutorial unter Linux

Dieser Artikel beschreibt Ihnen, wie Sie MySQL 8....

Umfassende Zusammenfassung zu MySQL GTID

Inhaltsverzeichnis 01 Einführung in GTID 02 Wie G...

Nach dem Docker-Lauf ist der Status immer „Beendet“

füge -it hinzu docker run -it -name test -d nginx...

Detailliertes Beispiel für MySQL ähnlich dem Schreiben von Oracle Rownum

Rownum ist eine einzigartige Schreibmethode in Or...

Centos8 erstellt NFS basierend auf KDC-Verschlüsselung

Inhaltsverzeichnis Konfiguration NFS-Server (nfs....

Vier Möglichkeiten zum Wechseln von Registerkarten in VUE

Inhaltsverzeichnis 1. Statische Implementierungsm...

Vorgehensweise bei der Installation einer virtuellen VMware Workstation-Maschine

Virtuelle Maschinen sind eine sehr praktische Tes...

Auszeichnungssprache - CSS-Layout

Klicken Sie hier, um zum Abschnitt „HTML-Tutorial“...

Mehrere Möglichkeiten zum Speichern von Bildern in einer MySQL-Datenbank

Normalerweise müssen die von Benutzern hochgelade...

So verwenden Sie xshell zum Herstellen einer Verbindung zu Linux in VMware (2 Methoden)

【Vorwort】 Ich möchte vor Kurzem das Prüfungssyste...

Detailliertes Tutorial zum Ersetzen von mysql8.0.17 in Windows 10

In diesem Artikel werden die spezifischen Schritt...