1. Beispielcode<!-- Unterkomponente comA --> <Vorlage> <div Klasse='Demo'> <Steckplatz><Steckplatz> <slotname='test'></slot> <slot name='scopedSlots' test='demo'></slot> </div> </Vorlage> <!-- Übergeordnete Komponente --> <comA> <span>Dies ist der Standardsteckplatz</span> <template slot='test'>Dies ist ein benannter Slot</template> <template slot='scopedSlots' slot-scope='scope'>Dies ist ein Scoped Slot (alte Version) {{scope.test}}</template> <template v-slot:scopedSlots='scopeProps' slot-scope='scope'>Dies ist ein Scoped Slot (neue Version) {{scopeProps.test}}</template> </comA> 2. Sehen Sie die Essenz durch das PhänomenDie Rolle von Slots besteht darin, eine Inhaltsverteilung zu erreichen. Um eine Inhaltsverteilung zu erreichen, sind zwei Bedingungen erforderlich:
3. Umsetzungsprinzip Die Reihenfolge der Instanziierung von Aus dem obigen Prozess können wir Folgendes schließen: 1. Die Vorlage der übergeordneten Komponente wird vor der untergeordneten Komponente analysiert, sodass die übergeordnete Komponente zuerst den Inhalt der Slot-Vorlage erhält 2. Die Vorlage der Unterkomponente wird später analysiert. Wenn die Unterkomponente also 3. Der Bereichssteckplatz kann Variablen in der Unterkomponente abrufen, sodass die Die gesamte Slot-Verarbeitungsphase gliedert sich grob in drei Schritte:
Anhand des folgenden Codes als Beispiel wird der Betriebsvorgang des Steckplatzes kurz erläutert. <div id='App'> <Prüfung> <template slot="hallo"> 123 </Vorlage> </Prüfung> </div> <Skript> neuer Vue({ el: '#app', Komponenten: prüfen: { Vorlage: '<h1>' + '<slot name="hallo"></slot>' + '</h1>' } } }) </Skript> 4. Kompilierungsphase der übergeordneten Komponente Beim Kompilieren wird die Vorlagendatei in einen { Schlagwort: 'Test', scopedSlots: { // Bereichsslot // Slotname: ASTNode, // ... } Kinder: [ { Tag: 'Vorlage', // ... übergeordneter Knoten: übergeordneter ASTNode, children: [ childASTNode ], // Slot-Inhalt untergeordneter Knoten, d. h. Textknoten 123 slotScope: nicht definiert, // Bereichsslot-Bindungswert slotTarget: "\"hallo\"", // Benannter Slotname slotTargetDynamic: false // Ist es ein dynamisch gebundener Slot// ... } ] } 5. Die übergeordnete Komponente generiert eine Rendering-Methode Gemäß dem mit(diesem){ return _c('div',{attrs:{"id":"app"}}, [_c('Prüfung', [ _c('template',{slot:"hallo"},[_v("\n 123\n ")])],2) ], 1) } 6. Übergeordnete Komponente generiert VNode Rufen Sie die { Tag: 'div', Elternteil: undefiniert, data: { // VNode-Konfigurationselemente speichern attrs: { id: '#app' } }, Kontext: Komponentenkontext, // Komponentenbereich elm: nicht definiert, // echtes DOM-Element untergeordnete Elemente: [ { Tag: 'vue-component-1-test', children: undefined, // Die Komponente ist die kleinste Einheit der Seite, und der Slot-Inhalt wird in der untergeordneten Komponente analysiert parent: undefined, componentOptions: { // Komponentenkonfigurationselement Ctor: VueComponentCtor, // Komponentenkonstruktionsmethode data: { Haken: { init: fn, //Komponente instanziieren, die die Methode aufruft insert: fn, Vorpatch: fn, zerstören: fn }, scopedSlots: { //Scope-Slot-Konfigurationselement, wird zum Generieren von Scope-Slot-VNode verwendet Steckplatzname: SteckplatzFn } }, untergeordnete Elemente: [ // Komponenten-Slot-Knoten-Tag: 'Vorlage', propsData: undefiniert, // Props-Parameter-Listener: undefiniert, Daten: { Slot: "Hallo" }, untergeordnete Elemente: [ VNode ], Elternteil: undefiniert, Kontext: Komponentenkontext // Geltungsbereich der übergeordneten Komponente // ... ] } } ], // ... } In 7. Initialisierung des Unterkomponentenstatus Beim Instanziieren einer Unterkomponente wird der Unterkomponenten-Slot-Knoten in 8. Kompilierungsphase der Unterkomponenten Während der Kompilierungsphase kompiliert die Unterkomponente { tag: 'h1', Elternteil: undefiniert, Kinder: [ { Schlagwort: 'Slot', Slotname: "\"Hallo\"", // ... } ], // ... } 9. Rendering-Methode zur Generierung von Unterkomponenten Die generierte Rendering-Methode lautet wie folgt, wobei // Rendering-Methode mit (diesem) { return _c('h1',[ _t("hallo") ], 2) } // Quellcodepfad: vue-dev\src\core\instance\render-helpers\render-slot.js Exportfunktion RenderSlot ( Name: Zeichenfolge, Fallback: ?Array<VNode>, Requisiten: ?Objekt, bindObject: ?Objekt ): ?Array<VNode> { const scopedSlotFn = this.$scopedSlots[name] let-Knoten if (scopedSlotFn) { // Slot mit Gültigkeitsbereich Requisiten = Requisiten || {} wenn (Bindeobjekt) { wenn (Prozess.env.NODE_ENV !== 'Produktion' && !isObject(bindObject)) { warnen( 'Slot V-Bind ohne Argument erwartet ein Objekt', Das ) } Requisiten = erweitern(erweitern({}, bindObject), Requisiten) } //Slot erweitern, Slot-VNode abrufen Knoten = scopedSlotFn(Eigenschaften) || Fallback } anders { // Holen Sie sich den Steckplatz normalen Steckplatz VNode Knoten = dies.$slots[Name] || Fallback } const Ziel = Requisiten && Requisiten.Slot wenn (Ziel) { gib dies zurück. $createElement('template', { slot: target }, nodes) } anders { Rückgabeknoten } } Unterschied zwischen Scoped Slots und Named Slots <!-- Demo --> <div id='App'> <Prüfung> <template slot="hallo" slot-scope='Umfang'> {{scope.hello}} </Vorlage> </Prüfung> </div> <Skript> var vm = neuer Vue({ el: '#app', Komponenten: prüfen: { Daten () { zurückkehren { hallo: '123' } }, Vorlage: '<h1>' + '<slot name="hallo" :hallo="hallo"></slot>' + '</h1>' } } }) </Skript> Der Hauptunterschied zwischen Slots mit Gültigkeitsbereich und normalen Slots besteht darin, dass der Slot-Inhalt Variablen mit Gültigkeitsbereich für Unterkomponenten erhalten kann. Aufgrund der Notwendigkeit, Unterkomponentenvariablen einzufügen, unterscheiden sich bereichsbezogene Slots in den folgenden Punkten von benannten Slots: Beim Zusammenstellen der Rendering-Methode generiert der Bereichsslot eine Methode, die den Injektionsbereich enthält. Im Vergleich zu mit (diesem) { return _c('div', { Attribute: { "id": "App" } }, [_c('test', { Bereichsslots: _u([{ Taste: "Hallo", fn: Funktion (Umfang) { return [_v("\n " + _s(scope.hello) + "\n ")] } }]) })], 1) } Wenn die Unterkomponente initialisiert wird, wird der benannte Slot-Knoten verarbeitet und an die Komponente Abgesehen davon ist der Vorgang ziemlich gleich. Der Mechanismus der Slots ist nicht schwer zu verstehen, der Schlüssel liegt jedoch in den beiden Schritten der Vorlagenanalyse und der Generierung von Rendering-Funktionen, die komplexer sind, einen längeren Prozess umfassen und schwieriger zu verstehen sind. 10. Nutzungstipps Durch die obige Analyse können wir den Slot-Verarbeitungsablauf grob verstehen. Die meiste Arbeit wird mit Vorlagen zum Schreiben 10.1. Benannte SlotsDie Slot-Verarbeitung gliedert sich im Allgemeinen in zwei Teile:
<div id='App'> <!-- <Prüfung>--> <!-- <template slot="hallo">--> <!-- 123--> <!-- </template>--> <!-- </test>--> </div> <Skript> neuer Vue({ // el: '#app', rendern (Element erstellen) { returniere createElement('test', [ Element erstellen('h3', { Slot: 'Hallo', domProps: { innererText: '123' } }) ]) }, Komponenten: prüfen: { rendern(Element erstellen) { returniere createElement('h1', [this.$slots.hello]); } // Vorlage: '<h1>' + // '<slot name="hallo"></slot>' + // '</h1>' } } }).$mount('#app') </Skript> 10.2. Slots mit begrenztem Gültigkeitsbereich Bereichsbezogene Slots sind flexibler zu verwenden und können Zustände von Unterkomponenten einfügen. Scoped Slots + <div id='App'> <!-- <Prüfung>--> <!-- <span slot="hallo" slot-scope='scope'>--> <!-- {{scope.hello}}--> <!-- </span>--> <!-- </test>--> </div> <Skript> neuer Vue({ // el: '#app', rendern (Element erstellen) { returniere Element erstellen('test', { Bereichsslots: { hallo: scope => { // In der Rendering-Methode der übergeordneten Komponente stimmt die endgültig konvertierte Scope-Slot-Methode mit dieser Schreibmethode überein return createElement('span', { domProps: { innererText: Umfang.hallo } }) } } }) }, Komponenten: prüfen: { Daten () { zurückkehren { hallo: '123' } }, rendern (Element erstellen) { // Die übergeordnete Komponente des Scope-Slots übergibt eine Funktion, die manuell aufgerufen werden muss, um einen VNode zu generieren let slotVnode = this.$scopedSlots.hello({ hallo: this.hello }) returniere createElement('h1', [ slotVnode ]) } // Vorlage: '<h1>' + // '<slot name="hallo" :hallo="hallo"></slot>' + // '</h1>' } } }).$mount('#app') </Skript> Oben wird kurz der detaillierte Inhalt des Implementierungsprinzips von Vue-Slots erläutert. Weitere Informationen zu Vue-Slots finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Eine benutzerfreundliche Alternative in Linux (Befehl fd)
Statische Dateien Nginx ist für seine hohe Leistu...
GitHub-Adresse, Sie können es mit einem Stern mar...
Dieser Artikel beschreibt, wie man Redis- und php...
Ändern Sie den Standardstil der Auswahl, normalerw...
Methode 1: INSERT INTO t1(Feld1,Feld2) VALUE(v001...
Effektvorschau Ideen Scrollen Sie durch die aktue...
Hintergrund Bei der Data-Warehouse-Modellierung w...
Inhaltsverzeichnis 1. Kommentare zu MySQL-Primärs...
Im entpackten Paket von Windows 64-Bit MySQL 5.7 ...
Beim Installieren von Paketen auf einem Ubuntu-Se...
Inhaltsverzeichnis 1. Unterschiede zwischen Optio...
Vorwort Obwohl der Feiertag vorbei ist, zeigt er ...
Ich erinnere mich an eine Frage, die der Intervie...
Installieren Sie die entpackte Version der MySql-...
Motor Einführung Innodb-Engine Die Innodb-Engine ...