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
<html> <Kopf> <meta http-equiv=&quo...
Das Projekt wurde in diesen Tagen getestet und de...
Inhaltsverzeichnis 1. Was ist eine Unterabfrage? ...
Problemcode Schauen Sie sich den Code eines durch...
Serverinformationen Verwaltungsserver: m01 172.16...
Die Protokolle in MySQL umfassen: Fehlerprotokoll...
Zwei Möglichkeiten zum Navigieren auf der Seite D...
Inhaltsverzeichnis Vorwort Ergebnisse erzielen Co...
1 Was ist der BEM-Namensstandard Bem ist die Abkü...
Faltdisplay mit mehrzeiligem Textbaustein Falten ...
JavaScript zeigt und verbirgt Bilder. Zu Ihrer In...
html <!DOCTYPE html> <html lang="de...
Eine kurze Beschreibung der Umgebungsvariablenkon...
In diesem Artikelbeispiel wird der spezifische Co...
Verwenden Sie hauptsächlich die Eigenschaften „pr...