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

Vue2.x - Beispiel für die Verwendung von Anti-Shake und Throttling

Inhaltsverzeichnis Dienstprogramme: Verwendung in...

Ideen und Methoden zur inkrementellen Sicherung einer MySQL-Datenbank

Um eine inkrementelle Sicherung der MySQL-Datenba...

MySql 8.0.11-Winxp64 (kostenlose Installationsversion) Konfigurations-Tutorial

1. Entpacken Sie das Zip-Paket in das Installatio...

Detaillierte Schritte zum Konfigurieren des Tomcat-Servers in IDEA 2020

Die Schritte zum Konfigurieren von Tomcat in IDEA...

So verstehen Sie SELinux unter Linux

Inhaltsverzeichnis 1. Einführung in SELinux 2. Gr...

Schritte zur Annotation von Metadeklarationen

Schritte zur Annotation von Metadeklarationen: 1. ...

Schriftreferenzen und Übergangseffekte außerhalb des Systems

Code kopieren Der Code lautet wie folgt: <span...