Vues Render-Funktion

Vues Render-Funktion

1. Knoten, Bäume und virtueller DOM

<div>
  <h1>Mein Titel</h1>
  Einige Textinhalte
  <!-- TODO: Slogan hinzufügen -->
</div>

Jedes Element ist ein Knoten. Jeder Textabsatz ist auch ein Knoten. Sogar Kommentare sind Knoten. Ein Knoten ist ein Abschnitt einer Seite. Genau wie bei einem Stammbaum kann jeder Knoten untergeordnete Knoten haben (d. h., jeder Teil kann andere Teile enthalten).

Das effiziente Aktualisieren aller dieser Knoten kann schwierig sein, aber glücklicherweise müssen Sie dies nicht manuell tun. Sie müssen Vue lediglich mitteilen, wie das HTML auf der Seite aussehen soll. Dies kann in einer Vorlage erfolgen:

<h1>{{ Blogtitel }}</h1>

Oder in einer Renderfunktion:

rendern: Funktion (ErstelleElement) {
  returniere createElement('h1', dieser.BlogTitel)
}

In beiden Fällen hält Vue die Seite automatisch auf dem neuesten Stand, auch wenn sich der Blogtitel ändert.

2. Virtueller DOM

Vue erstellt einen virtuellen DOM, um zu verfolgen, wie sich der reale DOM ändert. Bitte schauen Sie sich diese Codezeile genau an:

returniere createElement('h1', dieser.BlogTitel)

Was genau gibt createElement zurück? Eigentlich kein echtes DOM-Element. Ein genauerer Name wäre möglicherweise createNodeDescription , da die darin enthaltenen Informationen Vue mitteilen, welche Art von Knoten auf der Seite gerendert werden muss, einschließlich der Beschreibungsinformationen seiner untergeordneten Knoten. Wir bezeichnen solche Knoten als „ virtual node “, die oft als „ VNode “ abgekürzt werden. „Virtual DOM“ ist die Bezeichnung für den gesamten VNode-Baum, der vom Vue-Komponentenbaum erstellt wird.

// @returns {VNode}
Element erstellen(
  // {String | Objekt | Funktion}
  // Ein HTML-Tagname, ein Komponentenoptionsobjekt oder // eine asynchrone Funktion, die zu einem der oben genannten Ergebnisse führt. Pflichtfeld.
  'div',

  // {Objekt}
  // Ein Datenobjekt, das dem Attribut in der Vorlage entspricht. Optional.
  {
    // (Einzelheiten siehe nächsten Abschnitt)
  },

  // {Zeichenfolge | Array}
  // Untergeordnete virtuelle Knoten (VNodes), erstellt durch `createElement()`,
  // Sie können auch Zeichenfolgen verwenden, um „virtuelle Textknoten“ zu generieren. Optional.
  [
    'Schreiben Sie zuerst einen Text',
    createElement('h1', 'Eine Überschrift'),
    createElement(MeineKomponente, {
      Requisiten: {
        einigeProp: "foobar"
      }
    })
  ]
)

2.1 Eintauchen in Datenobjekte

In Renderfunktionen verfügen einige Vorlagenattribute über Felder der obersten Ebene im Vnode-Datenobjekt, das auch die Bindung an normale Attribute sowie DOM property wie innerHTML (das die v-html-Direktive überschreibt) ermöglicht.

{
  // Gleiche API wie `v-bind:class`,
  // Akzeptiert einen String, ein Objekt oder ein Array aus Strings und Objekten 'class': {
    foo: wahr,
    Balken: falsch
  },
  // Gleiche API wie `v-bind:style`,
  // Akzeptiert einen String, ein Objekt oder ein Array von Objekten style: {
    Farbe: 'rot',
    Schriftgröße: '14px'
  },
  // Normales HTML-Attribut
  Attribute: {
    ID: "foo"
  },
  // Komponenteneigenschaft
  Requisiten: {
    myProp: "Balken"
  },
  // DOM-Eigenschaften
  domProps: {
    innerHTML: 'baz'
  },
  // Der Ereignislistener befindet sich innerhalb von „on“,
  // Aber Modifikatoren wie „v-on:keyup.enter“ werden nicht mehr unterstützt.
  // Der Schlüsselcode muss in der Verarbeitungsfunktion manuell überprüft werden.
  An: {
    Klicken Sie auf: this.clickHandler
  },
  // Wird nur für Komponenten verwendet, um auf native Ereignisse zu hören, nicht auf Ereignisse, die durch // „vm.$emit“ innerhalb von Komponenten ausgelöst werden.
  nativeOn: {
    Klicken Sie auf: this.nativeClickHandler
  },
  // Benutzerdefinierte Anweisungen. Beachten Sie, dass Sie `oldValue` nicht in `binding` verwenden können.
  // Zuweisung, da Vue es automatisch für Sie synchronisiert hat.
  Anweisungen: [
    {
      Name: "Meine benutzerdefinierte Direktive",
      Wert: '2',
      Ausdruck: '1 + 1',
      Argument: "foo",
      Modifikatoren:
        Balken: wahr
      }
    }
  ],
  // Das Format eines Slots mit Gültigkeitsbereich ist // { name: props => VNode | Array<VNode> }
  Bereichsslots: {
    Standard: Requisiten => createElement('span', Requisiten.text)
  },
  // Wenn die Komponente eine Unterkomponente einer anderen Komponente ist, müssen Sie einen Namen für den Slot angeben: „Name des Slots“,
  // Andere spezielle Eigenschaften der obersten Ebene
  Schlüssel: 'myKey',
  Referenz: „myRef“,
  // Wenn Sie den gleichen Ref-Namen auf mehrere Elemente in der Rendering-Funktion anwenden,
  // Dann wird „$refs.myRef“ zu einem Array.
  refInFor: wahr
}

2.2 Einschränkungen

VNode muss eindeutig sein

Alle VNode in einem Komponentenbaum müssen eindeutig sein. Dies bedeutet, dass die folgende Renderfunktion unzulässig ist:

rendern: Funktion (ErstelleElement) {
  var meinParagraphVNode = createElement('p', 'hi')
  returniere createElement('div', [
    // Fehler – Doppelter VNode
    meinParagraphVNode, meinParagraphVNode
  ])
}

Wenn Sie ein Element/eine Komponente wirklich oft wiederholen müssen, können Sie dazu eine Factory-Funktion verwenden. Beispielsweise rendert die folgende Renderfunktion 20 identische Absätze auf völlig legale Weise:

rendern: Funktion (ErstelleElement) {
  returniere createElement('div',
    Array.apply(null, { Länge: 20 }).map(Funktion () {
      gibt createElement('p', 'hallo') zurück
    })
  )
}

3. Vorlagenfunktion in der Renderfunktion

3.1 v-if und v-for

Solange etwas problemlos in nativem JavaScript erledigt werden kann, bieten die Renderfunktionen von Vue keine proprietären Alternativen. Beispielsweise werden v-if und v-for in Vorlagen verwendet:

<ul v-if="Artikel.Länge">
  <li v-for="Artikel in Artikeln">{{ Artikel.name }}</li>
</ul>
<p v-else>Keine Elemente gefunden.</p>

Diese können alle in der Renderfunktion mit JavaScript if/else und map neu geschrieben werden:

Requisiten: ['Artikel'],
rendern: Funktion (ErstelleElement) {
  wenn (diese.Artikel.Länge) {
    returniere createElement('ul', this.items.map(Funktion (Element) {
      returniere createElement('li', item.name)
    }))
  } anders {
    return createElement('p', 'Keine Elemente gefunden.')
  }
}

3.2 V-Modell

Es gibt kein direktes Gegenstück zum v-model in der Renderfunktion - Sie müssen die entsprechende Logik selbst implementieren:

Requisiten: ['Wert'],
rendern: Funktion (ErstelleElement) {
  var selbst = dies
  returniere createElement('Eingabe', {
    domProps: {
      Wert: selbst.Wert
    },
    An: {
      Eingabe: Funktion (Ereignis) {
        self.$emit('Eingabe', Ereignis.Ziel.Wert)
      }
    }
  })
}

Das ist der Preis dafür, auf eine niedrige Ebene zu gehen, aber es gibt Ihnen eine viel feinere Kontrolle über die Einzelheiten der Interaktion als v-model .

3.3 Ereignisse und Tastenmodifikatoren

Für die Ereignismodifikatoren . passive , . capture und . once bietet Vue entsprechende Präfixe, die verwendet werden können für:

Zum Beispiel:

An: {
  '!klick': dies.macheDiesImAufnahmemodus,
  '~keyup': dies.macheDiesEinmal,
  '~!mouseover': dies.macheDiesEinmalImAufnahmemodus
}

Für alle anderen Modifikatoren ist das Präfix „private“ nicht erforderlich, da Sie die Ereignismethode innerhalb des Ereignishandlers verwenden können:


Hier ist ein Beispiel mit allen Modifikatoren:

An: {
  keyup: Funktion (Ereignis) {
    // Wenn das Element, das das Ereignis auslöst, nicht das Element ist, an das das Ereignis gebunden ist, // dann returniere if (event.target !== event.currentTarget) returniere
    // Wenn die Eingabetaste nicht gedrückt wurde oder // die Umschalttaste nicht gleichzeitig gedrückt wurde // dann return if (!event.shiftKey || event.keyCode !== 13) return
    // Stoppen Sie das Aufsteigen des Ereignisses event.stopPropagation()
    // Verhindern Sie das Standard-Keyup-Ereignis des Elements event.preventDefault()
    // ...
  }
}

3.4 Steckplätze

Sie können auf den Inhalt statischer Slots über this.$slots zugreifen, wobei jeder Slot ein Array von VNode ist:

rendern: Funktion (ErstelleElement) {
  // `<div><slot></slot></div>`
  returniere createElement('div', this.$slots.default)
}

Sie können auch über this.$scopedSlots auf Bereichsslots zugreifen . Jeder Bereichsslot ist eine Funktion, die eine Anzahl von VNode zurückgibt:

Requisiten: ['Nachricht'],
rendern: Funktion (ErstelleElement) {
  // `<div><slot :text="Nachricht"></slot></div>`
  returniere createElement('div', [
    dies.$scopedSlots.default({
      Text: diese.Nachricht
    })
  ])
}

Wenn Sie mithilfe einer Renderfunktion Slots mit Gültigkeitsbereich an untergeordnete Komponenten übergeben möchten, können Sie das Feld scopedSlots im VNode -Datenobjekt verwenden:

rendern: Funktion (ErstelleElement) {
  // `<div><child v-slot="props"><span>{{ props.text }}</span></child></div>`
  returniere createElement('div', [
    Element erstellen('Kind', {
      // Übergeben Sie `scopedSlots` im Datenobjekt
      // Das Format ist { name: props => VNode | Array<VNode> }
      Bereichsslots: {
        Standard: Funktion (Eigenschaften) {
          returniere createElement('span', props.text)
        }
      }
    })
  ])
}

3.5 Beispiele

importiere { CreateElement, RenderContext } aus 'vue/types/umd'

Standard exportieren {
  funktional: wahr,
  Requisiten: {
    Zeile: Objekt,
    rendern: Funktion,
    Index: Nummer,
    Spalte: {
      Typ: Objekt,
      Standard: null
    }
  },
  rendern: (h: ErstelleElement, ctx: RenderContext) => {
    Konstante Parameter: beliebig = {
      Zeile: ctx.props.row,
      Index: ctx.props.index
    }
    wenn (ctx.props.column) params.column = ctx.props.column
    returniere ctx.props.render(h, Parameter)
  }
}

Dies ist das Ende dieses Artikels über Render -Funktion von vue . Weitere relevante Inhalte Render -Funktion finden Sie in den vorherigen Artikeln von 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:
  • Verwendung der VUE-Renderfunktion und ausführliche Erklärung
  • Detaillierte Erklärung zur Verwendung der Vue.js-Renderfunktion
  • Festlegen der Ref-Operation für Unterkomponenten über die Renderfunktion in Vue
  • Die Vue-Renderfunktion lädt den Quellpfadvorgang von img dynamisch
  • Funktionsprinzip von Vue Render und Codebeispielanalyse
  • Detaillierte Erklärung der Renderfunktion in Vue
  • Verwenden Sie die Renderfunktion, um hoch skalierbare Komponenten zu kapseln

<<:  Warum die Tabellendateigröße nach dem Löschen von Daten in MySQL unverändert bleibt

>>:  MySQL: Praktische Erfahrung mit der Verwendung der Insert-Anweisung

Artikel empfehlen

So überprüfen Sie, ob MySQL erfolgreich installiert wurde

Nachdem MySQL installiert wurde, können Sie in ei...

Warum sind die Bilder in mobilen Web-Apps nicht klar und sehr verschwommen?

Warum? Am einfachsten lässt es sich so ausdrücken:...

VMware Workstation Pro installiert das Win10-Betriebssystem in Reinform

Dieser Artikel beschreibt die Schritte zur Instal...

Die unangemessenen MaxIdleConns von MySQL führen zu kurzen Verbindungen

1 Hintergrund Vor kurzem sind im Online-Geschäft ...

Detaillierte Erklärung zur Installation von MariaDB 10.2.4 auf CentOS7

CentOS 6 und frühere Versionen stellen MySQL-Serv...

Vue realisiert kaskadierende Auswahl von Provinzen, Städten und Bezirken

Vor Kurzem musste ich einen kaskadierenden Auswah...

Zusammenfassung der 10 gängigen HBase-Betriebs- und Wartungstools

Zusammenfassung: HBase verfügt über zahlreiche Be...

Eine kurze Erläuterung zur Verwendung von Slots in Vue

Definition und Verwendung: Verwenden Sie die Slot...

JavaScript-HTML zur Implementierung der mobilen Red Envelope Rain-Funktionsseite

In diesem Artikelbeispiel wird der spezifische HT...

CSS3 zum Erreichen eines Menü-Hover-Effekts

Ergebnis: html <nav id="nav-1"> &...