1. Analyse des wichtigsten Quellcodes von v-bind1. Wo werden v-bind-Attribute einheitlich gespeichert: attrsMap und attrsList<p v-bind:title="vBindTitle"></p> Angenommen, das Nachdem Vue dieses HTML-Tag erhalten hat, verarbeitet es das Titelattribut und führt die folgenden Schritte aus:
Weitere Informationen zum Umgang mit allgemeinen Attributwerten wie 2. HTML analysieren, den Attributsatz attrs analysieren und im Start-Callback zurückgebenFunktion handleStartTag (Übereinstimmung) { ... const l = match.attrs.länge const attrs = neues Array(l) für (sei i = 0; i < l; i++) { const args = match.attrs[i] ... attrs[i] = { Name: args[1], Wert: decodeAttr(Wert, shouldDecodeNewlines) } } ... if (Optionen.start) { // Hier in die Startfunktion hochladen options.start(tagName, attrs, unary, match.start, match.end) } } 3. Erstellen Sie ASTElement im Start-Callback, createASTElement(..., attrs, ...)// HTML parsen parseHTML(Vorlage, { ... start(tag, attrs, unär, start, ende) { let element: ASTElement = createASTElement(tag, attrs, currentParent) // Beachten Sie hier die Attribute } }) 4. Nach der Erstellung generiert ASTElement attrsList und attrsMap// AST-Element erstellen Exportfunktion createASTElement ( Tag: Zeichenfolge, attrs: Array<ASTAttr>, // Attributobjekt-Array parent: ASTElement | void // übergeordnetes Element ist auch ASTElement ): ASTElement { // Gibt ASTElement zurück zurückkehren { Typ: 1, Etikett, attrsList: attrs, attrsMap: makeAttrsMap(attrs), }, Elternteil, Kinder: [] } } 5. Datentypdefinition von Attrs//Deklariere ein ASTAttr-Attribut abstrakter Syntaxbaum Objektdatentyp declare type ASTAttr = { Name: Zeichenfolge; // AttributnameWert: beliebig; // Attributwertdynamisch?: Boolesch; // Ist es ein dynamisches Attribut?Start?: Zahl; Ende?: Nummer }; 6. Funktion zum Erfassen von BindungsattributenFunktion zum Erfassen von Bindungsattributen getBindingAttr und Funktion zum Ausführen von Attributoperationen getAndRemoveAttr Exportfunktion getBindingAttr ( el: ASTElement, Name: Zeichenfolge, getStatic?: Boolesch ): ?Zeichenfolge { Konstant dynamischer Wert = getAndRemoveAttr(el, ':' + Name) || getAndRemoveAttr(el, 'v-bind:' + Name) wenn (dynamischerWert != null) { returniere ParseFilter(dynamischerWert) } sonst wenn (getStatic !== false) { const staticValue = getAndRemoveAttr(el, name) wenn (statischerWert != null) { gibt JSON.stringify(staticValue) zurück } } } // Hinweis: Dadurch wird nur das Attribut aus dem Array (attrsList) entfernt, sodass es // wird nicht von processAttrs verarbeitet. // Standardmäßig wird es NICHT aus der Karte (attrsMap) entfernt, da die Karte // wird während der Codegenerierung benötigt. Exportfunktion getAndRemoveAttr ( el: ASTElement, Name: Zeichenfolge, removeFromMap?: Boolesch ): ?Zeichenfolge { lass val wenn ((val = el.attrsMap[name]) != null) { const list = el.attrsList für (sei i = 0, l = Listenlänge; i < l; i++) { wenn (Liste[i].name === Name) { list.splice(i, 1) // Entfernt ein Attribut aus attrsList, entfernt aber nicht den Break aus attrsMap } } } if (entferneAusKarte) { el.attrsMap[name] löschen } Rückgabewert } 2. So erhalten Sie den Wert von v-bind Nehmen Sie den folgenden Code als Beispiel, um zu analysieren, wie Ich werde es analysieren, indem ich einige Szenen aufschreibe:
vBind:{ Schlüssel: +neues Datum(), Titel: „Dies ist ein HTML-Attribut v-bind“, Klasse: "{ borderRadius: isBorderRadius }" Stil: "{ min. Höhe: 100 + 'px' , max. Höhe}" Textinhalt: „Hallo Vue V-Bind“ } <div v-bind:key="vBind.key" v-bind:title="vBind.title" v-bind:Klasse="vBind.Klasse" v-bind:style="vBind.style" v-bind:text-content.prop="vBind.textContent" /> </div> 1. v-bind:key-QuellcodeanalyseFunktion Prozessschlüssel (el) { const exp = getBindingAttr(el, 'Schlüssel') wenn(exp){ ... el.key = exp; } } Die Funktion 2. v-bind:title Quellcodeanalyse Funktion processAttrs(el){ const list = el.attrsList; ... wenn (bindRE.test(name)) { // v-binden Name = Name.Ersetzen(BindRE, '') Wert = parseFilters(Wert) ... addAttr(el, Name, Wert, Liste[i], …) } } exportiere const bindRE = /^:|^\.|^v-bind:/ Exportfunktion addAttr(el: ASTElement, Name: Zeichenfolge, Wert: beliebig, Bereich?: Bereich, dynamisch?: boolesch) { const attrs = dynamisch ? (el.dynamicAttrs || (el.dynamicAttrs = [])) : (el.attrs || (el.attrs = [])) attrs.push(rangeSetItem({ Name, Wert, dynamisch }, Bereich)) el.plain = falsch } Durch Lesen des Quellcodes können wir sehen, dass vue bei nativen Attributen wie etwa dem Titel zuerst 3. v-bind:class-Quellcodeanalyse Funktion transformNode (el: ASTElement, Optionen: CompilerOptions) { const warn = options.warn || baseWarn const staticClass = getAndRemoveAttr(el, 'Klasse') wenn (statischeKlasse) { el.staticClass = JSON.stringify(staticClass) } const classBinding = getBindingAttr(el, 'class', false /* getStatic */) wenn (Klassenbindung) { el.classBinding = Klassenbindung } } In der Funktion 4. v-bind:style-Quellcodeanalyse Style ist ein Funktion transformNode (el: ASTElement, Optionen: CompilerOptions) { const warn = options.warn || baseWarn const staticStyle = getAndRemoveAttr(el, 'Stil') wenn (statischer Stil) { el.staticStyle = JSON.stringify(parseStyleText(staticStyle)) } const styleBinding = getBindingAttr(el, 'style', false /* getStatic */) wenn (Stilbindung) { el.styleBinding = Stilbindung } } In der Funktion 5. v-bind:text-content.prop Quellcode-Analyse Schauen wir uns den Quellcode an. Funktion Prozessattribute(el) { const list = el.attrsList ... wenn (bindRE.test(name)) { // v-binden if (Modifikatoren) { wenn (Modifikatoren.prop && !isDynamic) { Name = Kamelize(Name) wenn (Name === 'innerHTML') Name = 'innerHTML' } } wenn (Modifikatoren und Modifikatoren.prop) { addProp(el, Name, Wert, Liste[i], isDynamic) } } } Exportfunktion addProp (el: ASTElement, Name: Zeichenfolge, Wert: Zeichenfolge, Bereich?: Bereich, dynamisch?: Boolesch) { (el.props || (el.props = [])).push(rangeSetItem({ Name, Wert, dynamisch }, Bereich)) el.plain = falsch } Requisiten?: Array<ASTAttr>; Aus dem obigen Quellcode können wir ersehen, dass Es gibt eine Frage, über die es sich nachzudenken lohnt: Warum das tun? Was sind die Ähnlichkeiten und Unterschiede zu HTML-Attributen?
6. v-bind modifier.camel.sync Quellcode-Analyse . Tatsächlich war ich verwirrt, als ich den .sync-Modifikator zum ersten Mal sah, aber nachdem ich das .sync der Komponente sorgfältig gelesen und mit der tatsächlichen Arbeit kombiniert hatte, erkannte ich seine Leistungsstärke. <Übergeordnetes v-bind:foo="übergeordnet.foo" v-on:updateFoo="übergeordnetes.foo = $event" ></Übergeordnet> In Vue können Gibt es eine prägnantere Möglichkeit, es zu schreiben? ? ? Das ist, was wir hier haben, den .sync-Operator. Es kann wie folgt abgekürzt werden: <Übergeordnetes Element v-bind:foo.sync="parent.foo"></Übergeordnetes Element> Lösen Sie es dann in der untergeordneten Komponente über Schauen wir uns den Quellcode an: wenn (Modifikatoren.camel && !isDynamic) { Name = Kamelize(Name) } wenn (Modifikatoren.sync) { syncGen = genAssignmentCode(Wert, `$event`) wenn (!istDynamisch) { addHandler(el,`update:${camelize(name)}`,syncGen,null,false,warn,list[i]) // Hyphenate ist eine Silbentrennungsfunktion, wobei camelize eine Camel-Case-Funktion ist, if (hyphenate(name) !== camelize(name)) { addHandler(el,`update:${hyphenate(name)}`,syncGen,null,false,warn,list[i]) } } anders { // Handler mit dynamischem Ereignisnamen addHandler(el,`"update:"+(${name})`,syncGen,null,false,warn,list[i],true) } } Durch Lesen des Quellcodes können wir Folgendes sehen: Für die Attribute von Um Dies ist das Ende dieses Artikels zum Verständnis von v-bind in vue. Weitere relevante Inhalte zu v-bind in vue finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen! Das könnte Sie auch interessieren:
|
<<: Zusammenfassung einiger Punkte, die bei der Registrierung von Tomcat als Dienst zu beachten sind
>>: Vergleich der Effizienz verschiedener Methoden zum Löschen von Dateien in Linux
Inhaltsverzeichnis 1. So erhalten Sie Elemente Ho...
Heute habe ich mich beim Server angemeldet und mi...
In diesem Projekt wird der Docker-Container zum E...
Inhaltsverzeichnis 1. beforeunload-Ereignis 2. Er...
1. Betreten Sie den Container docker run [Option]...
Für die Bereitstellung von Hyper-V gelten die fol...
MySQL 5.7 fügt viele neue Funktionen hinzu, wie z...
Die Hover-Prompts von Vue2+elementui sind in exte...
Herausforderung: Wandelt die Zeichen &, <,...
Inhaltsverzeichnis 1. Ursprüngliche Definition 2....
MySQL-Vollsicherung 1. Aktivieren Sie das Binärpr...
Es wird empfohlen, zunächst mit dem Befehl sudo s...
Inhaltsverzeichnis Vorwort Ziel Erster Schritt: S...
Aus Langeweile habe ich ein paar einfache Übungen...
<div ausrichten="zentrieren"> <...