Template Syntax
Vue verwendet eine HTML-basierte Template-Syntax, die es Ihnen ermöglicht, das gerenderte DOM deklarativ an die Daten der zugrunde liegenden Komponenteninstanz zu binden. Alle Vue-Templates sind syntaktisch gültiges HTML, das von Spec-kompatiblen Browsern und HTML-Parsern geparst werden kann.
Unter der Haube kompiliert Vue die Vorlagen in hochoptimierten JavaScript-Code. In Kombination mit dem Reaktivitätssystem kann Vue auf intelligente Weise die minimale Anzahl von Komponenten ermitteln, die neu gerendert werden müssen, und die minimale Menge an DOM-Manipulationen anwenden, wenn sich der Zustand der App ändert.
Wenn Sie mit den Konzepten des virtuellen DOM vertraut sind und die rohe Kraft von JavaScript bevorzugen, können Sie anstelle von Vorlagen auch direkt Renderfunktionen schreiben, mit optionaler JSX-Unterstützung. Beachten Sie jedoch, dass diese Funktionen nicht das gleiche Maß an Kompilierzeit-Optimierung genießen wie Vorlagen.
Text Interpolation
Die einfachste Form der Datenbindung ist die Textinterpolation unter Verwendung der "Mustache"-Syntax (doppelte geschweifte Klammern):
template
<span>Message: {{ msg }}</span>
Der Mustache-Tag wird durch den Wert der Eigenschaft msg
der entsprechenden Komponenteninstanz ersetzt. Es wird auch aktualisiert, wenn sich die Eigenschaft "msg" ändert.
Raw HTML
Die doppelten Schnurrbärte interpretieren die Daten als reinen Text, nicht als HTML. Um echtes HTML auszugeben, müssen Sie die Richtlinie v-html
verwenden:
template
<p>Using text interpolation: {{ rawHtml }}</p>
<p>Using v-html directive: <span v-html="rawHtml"></span></p>
Verwendung der Textinterpolation: <span style="color: red">This should be red.</span>
Using v-html directive: This should be red.
Hier stoßen wir auf etwas Neues. Das v-html
Attribut, das Sie sehen, wird Direktive genannt. Direktiven werden mit dem Präfix "v-" versehen, um anzuzeigen, dass es sich um spezielle Attribute handelt, die von Vue bereitgestellt werden, und wie Sie vielleicht schon erraten haben, wenden sie ein spezielles reaktives Verhalten auf das gerenderte DOM an. Hier sagen wir im Grunde "halte das innere HTML dieses Elements mit der Eigenschaft rawHtml
der aktuellen aktiven Instanz auf dem neuesten Stand".
Der Inhalt des span
wird durch den Wert der rawHtml
-Eigenschaft ersetzt, interpretiert als einfaches HTML - Datenbindungen werden ignoriert. Beachten Sie, dass Sie v-html
nicht verwenden können, um Template-Teilbereiche zu komponieren, da Vue keine String-basierte Template-Engine ist. Stattdessen werden Komponenten als grundlegende Einheit für die Wiederverwendung und Komposition der Benutzeroberfläche bevorzugt.
Sicherheitswarnung
Das dynamische Rendern von beliebigem HTML auf Ihrer Website kann sehr gefährlich sein, da es leicht zu XSS-Schwachstellen führen kann. Verwenden Sie v-html
nur für vertrauenswürdige Inhalte und niemals für vom Benutzer bereitgestellte Inhalte.
Attribut Bindungen
Schnurrbärte können nicht innerhalb von HTML-Attributen verwendet werden. Verwenden Sie stattdessen ein v-bind
:
template
<div v-bind:id="dynamicId"></div>
Die v-bind
Direktive weist Vue an, das id
Attribut des Elements mit der dynamicId
Eigenschaft der Komponente synchron zu halten. Wenn der gebundene Wert null
oder undefined
ist, dann wird das Attribut aus dem gerenderten Element entfernt.
Kurzschrift
Weil v-bind
so häufig verwendet wird, hat es eine eigene Kurzsyntax:
template
<div :id="dynamicId"></div>
Attribute, die mit :
beginnen, sehen vielleicht etwas anders aus als normales HTML, aber es ist in der Tat ein gültiges Zeichen für Attributnamen und alle von Vue unterstützten Browser können es korrekt parsen. Darüber hinaus erscheinen sie nicht im endgültigen gerenderten Markup. Die Shorthand-Syntax ist optional, aber Sie werden sie wahrscheinlich zu schätzen wissen, wenn Sie später mehr über ihre Verwendung erfahren.
Für den Rest des Leitfadens werden wir die Shorthand-Syntax in Code-Beispielen verwenden, da dies die häufigste Verwendung für Vue-Entwickler ist.
Boolesche Attribute
Boolesche Attribute sind Attribute, die durch ihr Vorhandensein in einem Element wahre oder falsche Werte anzeigen können. Zum Beispiel ist disabled
eines der am häufigsten verwendeten booleschen Attribute.
v-bind
funktioniert in diesem Fall ein wenig anders:
template
<button :disabled="isButtonDisabled">Button</button>
Das Attribut disabled
wird einbezogen, wenn isButtonDisabled
einen wahrheitsgemäßen Wert hat. Es wird auch eingeschlossen, wenn der Wert ein leerer String ist, um die Konsistenz mit <button disabled="">
zu wahren. Für andere falsche Werte wird das Attribut weggelassen.
Dynamic binding of multiple attributes
Wenn Sie ein JavaScript-Objekt haben, das mehrere Attribute repräsentiert und wie folgt aussieht:
js
const objectOfAttrs = {
id: 'container',
class: 'wrapper'
}
Sie können sie an ein einzelnes Element binden, indem Sie v-bind
ohne ein Argument verwenden:
template
<div v-bind="objectOfAttrs"></div>
JavaScript-Ausdrücke verwenden
Bisher haben wir in unseren Templates nur an einfache Property Keys gebunden. Aber Vue unterstützt die volle Leistung von JavaScript-Ausdrücken innerhalb aller Datenbindungen:
template
{{ number + 1 }}
{{ ok ? 'YES' : 'NO' }}
{{ message.split('').reverse().join('') }}
<div :id="`list-${id}`"></div>
Diese Ausdrücke werden als JavaScript im Datenbereich der aktuellen Komponenteninstanz ausgewertet.
In Vue-Templates können JavaScript-Ausdrücke an den folgenden Stellen verwendet werden:
- Innerhalb von Textinterpolationen (Schnurrbart)
- Im Attributwert beliebiger Vue-Direktiven (spezielle Attribute, die mit
v-
beginnen)
Nur Ausdrücke
Jede Bindung kann nur einen einzigen Ausdruck enthalten. Ein Ausdruck ist ein Teil des Codes, der zu einem Wert ausgewertet werden kann. Eine einfache Prüfung ist, ob er nach return
verwendet werden kann.
Daher wird das Folgende NICHT funktionieren:
template
<!-- this is a statement, not an expression: -->
{{ var a = 1 }}
<!-- flow control won't work either, use ternary expressions -->
{{ if (ok) { return message } }}
Aufrufen von Funktionen
Es ist möglich, innerhalb eines Bindungsausdrucks eine Methode aufzurufen, die einer Komponente zugeordnet ist:
template
<span :title="toTitleDate(date)">
{{ formatDate(date) }}
</span>
TIP
Funktionen, die innerhalb von Bindungsausdrücken aufgerufen werden, werden jedes Mal aufgerufen, wenn die Komponente aktualisiert wird, daher sollten sie keine Nebeneffekte haben, wie z. B. das Ändern von Daten oder das Auslösen von asynchronen Operationen.
Eingeschränkter globaler Zugriff
Schablonenausdrücke sind in einer Sandbox untergebracht und haben nur Zugriff auf eine eingeschränkte Liste von Globals. Die Liste enthält häufig verwendete eingebaute Globals wie Math
und Date
.
Globals, die nicht explizit in der Liste enthalten sind, z.B. vom Benutzer angehängte Eigenschaften von window
, sind in Template-Ausdrücken nicht zugänglich. Sie können jedoch explizit zusätzliche Globals für alle Vue-Ausdrücke definieren, indem Sie sie zu app.config.globalProperties
hinzufügen.
Direktiven
Direktiven sind spezielle Attribute mit dem Präfix v-
. Vue bietet eine Reihe von eingebauten Direktiven, einschließlich v-html
und v-bind
, die wir oben eingeführt haben.
Es wird erwartet, dass die Werte von Direktiven-Attributen einzelne JavaScript-Ausdrücke sind (mit Ausnahme von v-for
, v-on
und v-slot
, die in den jeweiligen Abschnitten später behandelt werden). Die Aufgabe einer Direktive ist es, reaktiv Aktualisierungen auf das DOM anzuwenden, wenn sich der Wert ihres Ausdrucks ändert. Nehmen Sie v-if
als Beispiel:
template
<p v-if="seen">Now you see me</p>
Hier würde die v-if
-Direktive das Element p
entfernen oder einfügen, je nachdem, ob der Wert des Ausdrucks gesehen
wahr ist.
Argumente
Einige Direktiven können ein "Argument" enthalten, das durch einen Doppelpunkt nach dem Direktivennamen gekennzeichnet ist. Die Direktive "v-bind" wird zum Beispiel zur reaktiven Aktualisierung eines HTML-Attributs verwendet:
template
<a v-bind:href="url"> ... </a>
<!-- shorthand -->
<a :href="url"> ... </a>
Hier ist href
das Argument, das der Richtlinie v-bind
sagt, dass das Attribut href
des Elements an den Wert des Ausdrucks url
gebunden werden soll. In der Kurzschrift wird alles vor dem Argument (d.h. v-bind:
) zu einem einzigen Zeichen zusammengefasst, :
.
Ein weiteres Beispiel ist die Richtlinie "v-on", die auf DOM-Ereignisse reagiert:
template
<a v-on:click="doSomething"> ... </a>
<!-- shorthand -->
<a @click="doSomething"> ... </a>
Hier ist das Argument der Name des Ereignisses, auf das man hören soll: Klick
. Für "v-on" gibt es ein entsprechendes Kürzel, nämlich das Zeichen "@". Wir werden auch über die Ereignisbehandlung im Detail sprechen.
Dynamische Argumente
Es ist auch möglich, einen JavaScript-Ausdruck in einem Richtlinienargument zu verwenden, indem man ihn mit eckigen Klammern umschließt:
template
<!--
Note that there are some constraints to the argument expression,
as explained in the "Dynamic Argument Value Constraints" and "Dynamic Argument Syntax Constraints" sections below.
-->
<a v-bind:[attributeName]="url"> ... </a>
<!-- shorthand -->
<a :[attributeName]="url"> ... </a>
Hier wird Attributname
dynamisch als JavaScript-Ausdruck ausgewertet, und sein ausgewerteter Wert wird als endgültiger Wert für das Argument verwendet. Wenn Ihre Komponenteninstanz beispielsweise eine Dateneigenschaft, Attributname
, hat, deren Wert href
ist, dann entspricht diese Bindung v-bind:href
.
In ähnlicher Weise können Sie dynamische Argumente verwenden, um einen Handler an einen dynamischen Ereignisnamen zu binden:
template
<a v-on:[eventName]="doSomething"> ... </a>
<!-- shorthand -->
<a @[eventName]="doSomething">
Wenn in diesem Beispiel der Wert von "eventName" "focus" ist, entspricht "v-on:[eventName]" dem Wert von "v-on:focus".
Dynamische Argumentwertbeschränkungen
Von dynamischen Argumenten wird erwartet, dass sie als Zeichenkette ausgewertet werden, mit Ausnahme von null
. Der spezielle Wert "null" kann verwendet werden, um die Bindung explizit zu entfernen. Jeder andere Wert, der keine Zeichenkette ist, löst eine Warnung aus.
Dynamische Argument-Syntax-Beschränkungen
Dynamische Argumentausdrücke unterliegen einigen syntaktischen Einschränkungen, da bestimmte Zeichen, wie Leerzeichen und Anführungszeichen, innerhalb von HTML-Attributnamen ungültig sind. Zum Beispiel ist das Folgende ungültig:
template
<!-- This will trigger a compiler warning. -->
<a :['foo' + bar]="value"> ... </a>
Wenn Sie ein komplexes dynamisches Argument übergeben müssen, ist es wahrscheinlich besser, eine berechnete Eigenschaft zu verwenden, die wir in Kürze behandeln werden.
Bei der Verwendung von In-DOM-Templates (Templates, die direkt in eine HTML-Datei geschrieben werden) sollten Sie außerdem vermeiden, Schlüssel mit Großbuchstaben zu benennen, da die Browser Attributnamen in Kleinbuchstaben umwandeln:
template
<a :[someAttr]="value"> ... </a>
Die obigen Angaben werden in den In-DOM-Vorlagen in :[someattr]
umgewandelt. Wenn Ihre Komponente eine someAttr
-Eigenschaft anstelle von someattr
hat, wird Ihr Code nicht funktionieren. Templates innerhalb von Single-File Components unterliegen nicht dieser Einschränkung.
Modifikatoren
Modifikatoren sind spezielle Postfixe, die mit einem Punkt gekennzeichnet sind und anzeigen, dass eine Direktive auf besondere Weise gebunden werden soll. Zum Beispiel weist der Modifikator .prevent
die Direktive v-on
an, event.preventDefault()
für das ausgelöste Ereignis aufzurufen:
template
<form @submit.prevent="onSubmit">...</form>
Sie werden später weitere Beispiele für Modifikatoren sehen, für v-on
und für v-model
, wenn wir diese Funktionen untersuchen.
Und schließlich ist hier die vollständige Syntax der Richtlinie visualisiert: