Skip to content

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.

Bedingtes Rendering has loaded