1. GrundlagenVue empfiehlt in den meisten Fällen die Verwendung von Vorlagen zum Erstellen Ihres HTML. In einigen Szenarien benötigen Sie jedoch wirklich die volle Programmierleistung von JavaScript. Zu diesem Zeitpunkt können wir die Rendering-Funktion verwenden, die dem Compiler näher ist als die Vorlage Sehen wir uns ein einfaches Beispiel an, bei dem die Renderfunktion nützlich ist. Angenommen, wir möchten einige Überschriften mit Ankern generieren: <h1> <a name="hallo-welt" href="#hallo-welt" rel="external nofollow" > Hallo Welt! </a> </h1> Für das obige HTML haben wir beschlossen, die Komponentenschnittstelle wie folgt zu definieren: <anchored-heading :level="1">Hallo Welt!</anchored-heading> Wenn Sie mit dem Schreiben einer Komponente beginnen, die eine <script Typ="text/x-template" id="anchored-heading-template"> <h1 v-if="Ebene === 1"> <Steckplatz></Steckplatz> </h1> <h2 v-else-if="Ebene === 2"> <Steckplatz></Steckplatz> </h2> <h3 v-else-if="Ebene === 3"> <Steckplatz></Steckplatz> </h3> <h4 v-else-if="Ebene === 4"> <Steckplatz></Steckplatz> </h4> <h5 v-else-if="Ebene === 5"> <Steckplatz></Steckplatz> </h5> <h6 v-else-if="Ebene === 6"> <Steckplatz></Steckplatz> </h6> </Skript> Vue.component('ankerte Überschrift', { Vorlage: „#anchored-heading-template“, Requisiten: { Ebene: Typ: Nummer, erforderlich: true } } }) Die Verwendung einer Vorlage ist hier nicht die beste Wahl: Der Code ist nicht nur lang, sondern Obwohl Vorlagen in den meisten Komponenten gut funktionieren, sind sie hier eindeutig nicht geeignet. Versuchen wir also, das obige Beispiel mithilfe der Vue.component('ankerte Überschrift', { rendern: Funktion (ErstelleElement) { returniere Element erstellen( „h“ + this.level, // Tag-Name this.$slots.default // untergeordnetes Knoten-Array) }, Requisiten: { Ebene: Typ: Nummer, erforderlich: true } } }) Sieht viel einfacher aus! Dies vereinfacht den Code erheblich, erfordert jedoch, dass Sie mit 2. Knoten, Bäume und virtueller DOMBevor wir uns mit den Renderfunktionen befassen, ist es wichtig, ein wenig darüber zu verstehen, wie Browser funktionieren. Nehmen Sie das folgende HTML als Beispiel: <div> <h1>Mein Titel</h1> Einige Textinhalte <!-- TODO: Slogan hinzufügen --> </div> Wenn der Browser diesen Code liest, erstellt er einen Baum aus „DOM-Knoten“, um den Überblick zu behalten, genau so, wie Sie einen Stammbaum zeichnen würden, um die Entwicklung der Familienmitglieder zu verfolgen. Der dem obigen HTML entsprechende DOM-Knotenbaum wird unten angezeigt: 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. 1. 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 3. createElement-Parameter Als Nächstes müssen Sie wissen, wie Sie diese Funktionen in der Vorlage in der Funktion // @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" } }) ] ) 1. Tauchen Sie ein in Datenobjekte Dabei ist Folgendes zu beachten: So wie { // 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. Vollständiges BeispielMit diesem Wissen können wir nun die Komponente fertigstellen, die wir ursprünglich implementieren wollten: var getChildrenTextContent = Funktion (Kinder) { returniere untergeordnete Elemente.map(Funktion (Knoten) { node.children zurückgeben ? getChildrenTextContent(node.children) : Knoten.Text }).verbinden('') } Vue.component('ankerte Überschrift', { rendern: Funktion (ErstelleElement) { // Erstelle eine Kebab-Case-ID var ÜberschriftId = getChildrenTextContent(this.$slots.default) .toLowerCase() .replace(/\W+/g, '-') .replace(/(^-|-$)/g, '') returniere Element erstellen( 'h' + diese.Ebene, [ Element erstellen('a', { Attribute: { Name: Überschriften-ID, href: '#' + Überschriften-ID } }, dies.$slots.default) ] ) }, Requisiten: { Ebene: Typ: Nummer, erforderlich: true } } }) 3. Einschränkungen VNode muss eindeutig sein Alle VNodes 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 }) ) } 4. Verwenden Sie JavaScript, um Vorlagenfunktionen zu ersetzen1. v-wenn und v-für Solange etwas problemlos in nativem JavaScript erledigt werden kann, bieten die Renderfunktionen von Vue keine proprietären Alternativen. Beispielsweise werden <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.') } } 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 Sie haben dadurch eine viel feinere Kontrolle über die Einzelheiten der Interaktion als beim V-Modell. 3. Ereignisse und Schlüsselmodifikatoren Für Ereignismodifikatoren wie
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() // ... } } 4. Spielautomaten 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) } } }) ]) } 5. JSX Wenn Sie viele Element erstellen( 'verankerte Überschrift', { Requisiten: { Stufe: 1 } }, [ createElement('span', 'Hallo'), ' Welt!' ] ) Vor allem, wenn die entsprechende Vorlage so einfach ist: <ankerte Überschrift: Ebene="1"> Hallo Welt! </ankerte-Überschrift> Aus diesem Grund gibt es ein Babel-Plugin für die Verwendung der JSX-Syntax in Vue, das es uns ermöglicht, zu einer Syntax zurückzukehren, die näher an Vorlagen liegt. importiere AnchoredHeading aus './AnchoredHeading.vue' neuer Vue({ el: '#demo', rendern: Funktion (h) { zurückkehren ( <AnchoredHeading-Ebene={1}> Hallo Welt! </AnchoredHeading> ) } })
6. Funktionale KomponentenDie zuvor erstellte Ankertitelkomponente ist relativ einfach. Sie verwaltet keinen Status, hört nicht auf an sie übergebene Status und hat keine Lebenszyklusmethoden. In Wirklichkeit ist es nur eine Funktion, die einige Requisiten akzeptiert. In solchen Szenarien können wir die Komponente als funktional markieren, was bedeutet, dass sie zustandslos ist (keine reaktiven Daten) und keine Instanz hat (kein this-Kontext). Eine funktionsfähige Komponente sieht folgendermaßen aus: Vue.component('meine-Komponente', { funktional: wahr, // Requisiten sind optionale Requisiten: { // ... }, // Um das Fehlen einer Instanz auszugleichen // geben Sie ein zweites Argument als Kontext an render: function (createElement, context) { // ... } })
Wenn Sie in Version 2.5.0 und höher Einzeldateikomponenten verwenden, können vorlagenbasierte Funktionskomponenten wie folgt deklariert werden: <funktionale Vorlage> </Vorlage> Alles, was eine Komponente benötigt, wird als
Nachdem wir Da funktionale Komponenten lediglich Funktionen sind, ist der Rendering-Overhead viel geringer. Sie sind auch als Wrapper-Komponenten sehr nützlich. Wenn Sie beispielsweise Folgendes tun müssen:
Dies ist ein Beispiel für eine var EmptyList = { /* ... */ } var TableList = { /* ... */ } var OrderedList = { /* ... */ } var UnorderedList = { /* ... */ } Vue.component('Smart-Liste', { funktional: wahr, Requisiten: { Artikel: { Typ: Array, erforderlich: true }, isOrdered: Boolescher Wert }, rendern: Funktion (createElement, Kontext) { Funktion entsprechendeListComponent () { var Elemente = Kontext.Eigenschaften.Elemente wenn (items.length === 0) returniere EmptyList wenn (Typ der Elemente[0] === 'Objekt') gibt TableList zurück if (context.props.isOrdered) returniere OrderedList UngeordneteListe zurückgeben } returniere Element erstellen( entsprechendeListComponent(), Kontext.Daten, Kontext.Kinder ) } }) 1. Übergeben Sie Attribute und Ereignisse an untergeordnete Elemente oder KomponentenIn normalen Komponenten werden Attribute, die nicht als Props definiert sind, automatisch zum Stammelement der Komponente hinzugefügt, wobei vorhandene Attribute mit demselben Namen ersetzt oder intelligent zusammengeführt werden. Funktionale Komponenten erfordern jedoch, dass Sie dieses Verhalten explizit definieren: Vue.component('mein-funktionaler-Button', { funktional: wahr, rendern: Funktion (createElement, Kontext) { // Alle Attribute, Ereignis-Listener, untergeordneten Knoten usw. vollständig transparent übertragen. returniere createElement('Schaltfläche', Kontext.Daten, Kontext.Kinder) } }) Indem wir context.data als zweites Argument an Wenn Sie vorlagenbasierte Funktionskomponenten verwenden, müssen Sie Attribute und Listener auch manuell hinzufügen. Da wir Zugriff auf seinen eigenen Kontext haben, können wir alle <funktionale Vorlage> <Schaltfläche Klasse="btn btn-primary" v-bind="Daten.attrs" v-on="Zuhörer" > <Steckplatz/> </button> </Vorlage> 2. Vergleich zwischen Slots () und Kindern Sie fragen sich vielleicht, warum sowohl <meine-funktionale-Komponente> <p v-Steckplatz:foo> Erste </p> <p>Sekunde</p> </meine-funktionale-komponente> Für diese Komponente erhalten Sie durch untergeordnete Elemente zwei Absatz-Tags, während 7. VorlagenzusammenstellungVielleicht interessiert es Sie, dass Vue-Vorlagen tatsächlich in Renderfunktionen kompiliert werden. Dies ist ein Implementierungsdetail und normalerweise kein Grund zur Besorgnis. Wenn Sie jedoch sehen möchten, wie die Vorlagenfunktionalität zusammengestellt wird, könnte dies für Sie sehr interessant sein. Hier ist ein einfaches Beispiel für die Verwendung von Vue.compile zum schnellen Kompilieren einer Vorlagenzeichenfolge: <div> <Kopfzeile> <h1>Ich bin eine Vorlage!</h1> </header> <p v-if="message">{{ Nachricht }}</p> <p v-else>Keine Nachricht.</p> </div> machen: Funktion anonym( ) { mit(diesem){return _c('div',[_m(0),(Nachricht)?_c('p',[_v(_s(Nachricht))]):_c('p',[_v("Keine Nachricht.")])])} } statischeRenderFns: _m(0): Funktion anonym( ) { mit(diesem){return _c('header',[_c('h1',[_v("Ich bin eine Vorlage!")])])} } Dies ist das Ende dieses Artikels über Rendering-Funktionen und JSX-Details. Weitere relevante Rendering-Funktionen und JSX-Inhalte finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die verwandten Artikel weiter unten. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird! Das könnte Sie auch interessieren:
|
<<: Implementierung von MySQL Select in der Unterabfrageoptimierung
>>: Analyse der Implementierungsschritte für die Docker-Containerverbindung
Inhaltsverzeichnis 1. Erstellen Sie eine Wasserze...
Unter Linux können die Befehle cat, more und less...
Float wird häufig im Layout von Webseiten verwend...
Frage: Ich habe in Vue ein Formular zum Hochladen...
Inhaltsverzeichnis 1. Was ist Grub-Verschlüsselun...
Wenn ein Projekt eine gewisse Komplexität erreich...
Der Meta-Tag ist ein Hilfstag im Head-Bereich der...
In diesem Artikel wird der spezifische Code von j...
Inhaltsverzeichnis 1. fill()-Syntax 2. Verwendung...
Inhaltsverzeichnis 1. Installationsvoraussetzunge...
Eine Hyperlink-URL in Vm muss mit Chinesisch als P...
Verwenden Sie Textausrichtung, Rand: 0 automatisc...
Das Daten-URI-Schema ermöglicht es uns, Daten mith...
Überblick Eine der leistungsstärksten Funktionen ...
Schauen Sie sich zuerst den Code und die Wirkung ...