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 DOMVue 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 // @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 { // 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 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 Renderfunktion3.1 v-if und v-for Solange etwas problemlos in nativem <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 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 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 3.3 Ereignisse und Tastenmodifikatoren Für die Ereignismodifikatoren . 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 rendern: Funktion (ErstelleElement) { // `<div><slot></slot></div>` returniere createElement('div', this.$slots.default) } Sie können auch über 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 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 Beispieleimportiere { 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 Das könnte Sie auch interessieren:
|
<<: Warum die Tabellendateigröße nach dem Löschen von Daten in MySQL unverändert bleibt
>>: MySQL: Praktische Erfahrung mit der Verwendung der Insert-Anweisung
Die unten zusammengefassten Wissenspunkte werden ...
Dieser Artikel beschreibt die Support- und Proble...
1. Hintergrund 1.1 Probleme In einem aktuellen Pr...
Nachdem MySQL installiert wurde, können Sie in ei...
Warum? Am einfachsten lässt es sich so ausdrücken:...
Vor Kurzem mussten wir eine geplante Migration de...
Inhaltsverzeichnis 1. Zeichne einen Kreis 2. Krei...
Dieser Artikel beschreibt die Schritte zur Instal...
1 Hintergrund Vor kurzem sind im Online-Geschäft ...
CentOS 6 und frühere Versionen stellen MySQL-Serv...
Vor Kurzem musste ich einen kaskadierenden Auswah...
Zusammenfassung: HBase verfügt über zahlreiche Be...
Definition und Verwendung: Verwenden Sie die Slot...
In diesem Artikelbeispiel wird der spezifische HT...
Ergebnis: html <nav id="nav-1"> &...