Klassen- und Stilbindungen
Jobs by vuejobs.com
Ein häufiger Bedarf an Datenbindung ist die Bearbeitung der Klassenliste eines Elements und der Inline-Stile. Da class
und style
beides Attribute sind, können wir v-bind
verwenden, um ihnen dynamisch einen String-Wert zuzuweisen, ähnlich wie bei anderen Attributen. Allerdings kann der Versuch, diese Werte mit Hilfe von String-Konkatenation zu erzeugen, lästig und fehleranfällig sein. Aus diesem Grund bietet Vue spezielle Erweiterungen, wenn v-bind
mit class
und style
verwendet wird. Zusätzlich zu Strings können die Ausdrücke auch auf Objekte oder Arrays ausgewertet werden.
Binden von HTML-Klassen
Bindung an Objekte
Wir können ein Objekt an :class
(kurz für v-bind:class
) übergeben, um Klassen dynamisch umzuschalten:
template
<div :class="{ active: isActive }"></div>
Die obige Syntax bedeutet, dass das Vorhandensein der Klasse "active" durch die [Wahrhaftigkeit] (https://developer.mozilla.org/en-US/docs/Glossary/Truthy) der Dateneigenschaft "isActive" bestimmt wird.
Es können mehrere Klassen umgeschaltet werden, indem mehrere Felder im Objekt vorhanden sind. Darüber hinaus kann die :class
-Direktive auch mit dem einfachen Attribut class
koexistieren. Der folgende Zustand ist also gegeben:
js
const isActive = ref(true)
const hasError = ref(false)
Und die folgende Vorlage:
template
<div
class="static"
:class="{ active: isActive, 'text-danger': hasError }"
></div>
Es wird wiedergegeben:
template
<div class="static active"></div>
Wenn sich isActive
oder hasError
ändert, wird die Klassenliste entsprechend aktualisiert. Wenn zum Beispiel hasError
zu true
wird, wird die Klassenliste zu "static active text-danger"
.
Das gebundene Objekt muss nicht inline sein:
js
const classObject = reactive({
active: true,
'text-danger': false
})
template
<div :class="classObject"></div>
Dies wird das gleiche Ergebnis liefern. Wir können auch an eine berechnete Eigenschaft binden, die ein Objekt zurückgibt. Dies ist ein gängiges und leistungsfähiges Muster:
js
const isActive = ref(true)
const error = ref(null)
const classObject = computed(() => ({
active: isActive.value && !error.value,
'text-danger': error.value && error.value.type === 'fatal'
}))
template
<div :class="classObject"></div>
Bindung an Arrays
Wir können :class
an ein Array binden, um eine Liste von Klassen anzuwenden:
js
const activeClass = ref('active')
const errorClass = ref('text-danger')
template
<div :class="[activeClass, errorClass]"></div>
Das wird wiedergegeben:
template
<div class="active text-danger"></div>
Wenn Sie eine Klasse in der Liste auch bedingt umschalten möchten, können Sie dies mit einem ternären Ausdruck tun:
template
<div :class="[isActive ? activeClass : '', errorClass]"></div>
Dies wird immer errorClass
anwenden, aber activeClass
wird nur angewendet, wenn isActive
wahr ist.
Dies kann jedoch etwas umständlich sein, wenn Sie mehrere bedingte Klassen haben. Deshalb ist es auch möglich, die Objektsyntax innerhalb der Array-Syntax zu verwenden:
template
<div :class="[{ active: isActive }, errorClass]"></div>
Mit Komponenten
Dieser Abschnitt setzt Kenntnisse voraus über Komponenten. Sie können es auch überspringen und später wiederkommen.
Wenn Sie das Attribut class
für eine Komponente mit einem einzigen Wurzelelement verwenden, werden diese Klassen dem Wurzelelement der Komponente hinzugefügt und mit jeder bereits vorhandenen Klasse zusammengeführt.
Zum Beispiel, wenn wir eine Komponente mit dem Namen MyComponent
mit der folgenden Vorlage haben:
template
<!-- child component template -->
<p class="foo bar">Hi!</p>
Fügen Sie dann einige Klassen hinzu, wenn Sie sie verwenden:
template
<!-- when using the component -->
<MyComponent class="baz boo" />
Das gerenderte HTML wird sein:
template
<p class="foo bar baz boo">Hi</p>
Das Gleiche gilt für Klassenbindungen:
template
<MyComponent :class="{ active: isActive }" />
Wenn "isActive" wahrheitsgemäß ist, wird der gerenderte HTML-Code so aussehen:
template
<p class="foo bar active">Hi</p>
Wenn Ihre Komponente mehrere Wurzelelemente hat, müssen Sie festlegen, welches Element diese Klasse erhalten soll. Sie können dies mit der Komponenteneigenschaft $attrs
tun:
template
<!-- MyComponent template using $attrs -->
<p :class="$attrs.class">Hi!</p>
<span>This is a child component</span>
template
<MyComponent class="baz" />
Wird gerendert:
html
<p class="baz">Hallo!</p>
<span>Dies ist eine untergeordnete Komponente</span>
Weitere Informationen über die Vererbung von Komponentenattributen finden Sie unter Fallthrough-Attribute Abschnitt.
Binden von Inline-Styles
Bindung an Objekte
:style
unterstützt die Bindung an JavaScript-Objektwerte - es entspricht einer HTML-Element-Eigenschaft style
:
js
const activeColor = ref('red')
const fontSize = ref(30)
template
<div :style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
Obwohl camelCase-Schlüssel empfohlen werden, unterstützt :style
auch CSS-Eigenschaftsschlüssel in Großbuchstaben (wie sie in CSS verwendet werden) - zum Beispiel:
template
<div :style="{ 'font-size': fontSize + 'px' }"></div>
Oft ist es eine gute Idee, direkt an ein Stilobjekt zu binden, damit die Vorlage übersichtlicher ist:
js
const styleObject = reactive({
color: 'red',
fontSize: '13px'
})
template
<div :style="styleObject"></div>
Auch hier wird die Bindung im Objektstil häufig in Verbindung mit berechneten Eigenschaften verwendet, die Objekte zurückgeben.
Bindung an Arrays
Wir können :style
an ein Array von mehreren Style-Objekten binden. Diese Objekte werden zusammengeführt und auf dasselbe Element angewendet:
template
<div :style="[baseStyles, overridingStyles]"></div>
Automatisches Voranstellen
Wenn Sie eine CSS-Eigenschaft verwenden, für die ein vendor prefix in :style
, wird Vue automatisch das entsprechende Präfix hinzufügen. Vue macht dies, indem es zur Laufzeit überprüft, welche Style-Eigenschaften im aktuellen Browser unterstützt werden. Wenn der Browser eine bestimmte Eigenschaft nicht unterstützt, dann werden verschiedene präfixierte Varianten getestet, um eine zu finden, die unterstützt wird.
Mehrere Werte
Sie können zum Beispiel einer Stileigenschaft ein Array mit mehreren (vorangestellten) Werten zuweisen:
template
<div :style="{ display: ['-webkit-box', '-ms-flexbox', 'flex'] }"></div>
Dadurch wird nur der letzte Wert im Array wiedergegeben, den der Browser unterstützt. In diesem Beispiel wird display: flex
für Browser dargestellt, die die unpräfixierte Version von flexbox unterstützen.