Bedingtes Rendering
v-if
Die v-if-Direktive wird für das bedingte Rendering eines Blocks genutzt. Der Block wird nur ausgegeben, wenn der in der Direktive angegebene Ausruck true zurückgibt.
template
<h1 v-if="awesome">Vue is awesome!</h1>v-else
Die v-else-Direktive wird genutzt, um einen "else Block" für v-if anzugeben:
template
<button @click="awesome = !awesome">Toggle</button>
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>Vue is awesome!
Ein v-else-Element muss direkt hinter einem v-if- oder v-else-if-Element folgen - sonst wird es nicht erkannt und interpretiert.
v-else-if
Das v-else-if dient - wie der Name bereits vermuten lässt - als "else if Block" für ein v-if-Element. Es kann auch mehrfach genutzt werden:
template
<div v-if="type === 'A'">
A
</div>
<div v-else-if="type === 'B'">
B
</div>
<div v-else-if="type === 'C'">
C
</div>
<div v-else>
Not A/B/C
</div>Genauso wie bei v-else, muss ein v-else-if-Element direkt auf ein v-if- oder v-else-if-Element folgen.
v-if on <template>
Weil v-if eine Direktive ist, muss es auf ein einzelnes Element angewendet werden. Wenn mehrere Elemente betroffen sind, kann v-if auf ein <template>-Element angewendet werden, welches dann als unsichtbarer Container fungiert. Im Ergebnis des endgültigen Renderings ist das <template>-Element nicht enthalten.
template
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>v-else und v-else-if können ebenfalls auf ein <template> angewendet werden.
v-show
Eine weitere Möglichkeit, Elemente nur beim Eintreteten einer definierten Bedingung anzuzeigen, ist die v-show-Direktive. Die Nutzung ist größtenteils identisch mit der Nutzung von v-if:
template
<h1 v-show="ok">Hello!</h1>Der Unterschied besteht darin, dass ein Element, auf das die v-show-Direktive angewendet wird, immer gerendert wird und Teil des DOM ist. v-show steuert die Sichtbarkeit über das Setzen des CSS-Attributs display.
v-show bietet keine Unterstützung für die Nutzung mit einem <template>-Element und funktioniert auch nicht mit v-else.
v-if vs. v-show
v-if setzt "echtes" bedingtes Rendering um. Es stellt sicher, dass Listener und Unterkomponenten innerhalb des bedingten Blockes korrekt zerstört bzw. neu angelegt werden, wenn sich das Ergebnis des Bedingungsausdruckes ändert.
v-if ist lazy: Falls die Bedingung beim initialen Rendern false ist, passiert zunächst gar nichts - der betroffene Block wird solange nicht gerendert, bis die Bedingung das erste mal zu true evaluiert wird.
v-show ist im Vergleich deutlich einfacher gestaltet - das betroffene Element wird unabhängig vom initialen Evaluierungsergebnis der Bedingung immer in das DOM gerendert. Die Sichtbarkeit wird mit CSS-Mitteln gesteuert.
Generell sind im Vergleich die Kosten für die Zustandsänderung bei v-if höher, während die Kosten für das initiale Rendern von v-show höher sind. v-show sollte bevorzugt werden, wenn die Sichtbarkeit eines Elements oft geändert wird. v-if sollte eingesetzt werden, wenn es eher unwahrscheinlich ist, dass die Bedingung sich zur Laufzeit ändert.
v-if in Kombination mit v-for
Hinweis
Wegen der impliziten Prioritätsregeln wird es nicht empfohlen, v-if und v-for auf demselben Element zu nutzen. Details dazu sind im Style-Guide beschrieben.
Wenn v-if und v-for beide auf demselben Element verwendet werden, wird v-if zuerst evaluiert. Der List Rendering Guide gibt hierzu tiefergehende Informationen.