Skip to content

Vue 条件语句

在 Vue 中,我们可以使用一系列指令来实现条件渲染,即根据特定条件的真假来决定是否渲染某一块 DOM 内容。主要的指令包括 v-ifv-else-ifv-else

v-if

v-if 指令用于条件性地渲染一块内容。这块内容只会在指令的表达式返回真值时才会被渲染。

vue
<script setup>
import { ref } from 'vue'

const awesome = ref(true)
</script>

<template>
  <h1 v-if="awesome">Vue is awesome!</h1>
</template>

如果 awesome 的值为 false,那么 <h1> 元素将根本不会被创建和插入到 DOM 中。

v-else

你可以使用 v-else 指令来表示 v-if 的“else 块”。

vue
<template>
  <button @click="awesome = !awesome">Toggle</button>

  <h1 v-if="awesome">Vue is awesome!</h1>
  <h1 v-else>Oh no 😢</h1>
</template>

v-else 元素必须紧跟在带 v-if 或者 v-else-if 的元素的后面,否则它将不会被识别。

v-else-if

v-else-if,顾名思义,充当一个 v-if 的“else-if 块”,可以连续使用多次。

vue
<script setup>
import { ref } from 'vue'

const score = ref(85)
</script>

<template>
  <div v-if="score >= 90">优秀</div>
  <div v-else-if="score >= 80">良好</div>
  <div v-else-if="score >= 60">及格</div>
  <div v-else>不及格</div>
</template>

类似于 v-elsev-else-if 也必须紧跟在 v-ifv-else-if 元素之后。

<template> 上使用 v-if

因为 v-if 是一个指令,所以必须将它添加到一个元素上。但是,如果我们想切换多个元素呢?此时我们可以把一个 <template> 元素当做不可见的包裹元素,并在上面使用 v-if。最终的渲染结果将不包含 <template> 元素。

vue
<template>
  <template v-if="ok">
    <h1>Title</h1>
    <p>Paragraph 1</p>
    <p>Paragraph 2</p>
  </template>
</template>

v-show

另一个用于条件性显示元素的选项是 v-show 指令。用法大致一样:

vue
<h1 v-show="ok">Hello!</h1>

不同的是带有 v-show 的元素始终会被渲染并保留在 DOM 中。v-show 只是简单地切换元素的 CSS display 属性。

v-if vs v-show

  • v-if 是“真正”的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建。v-if 也是惰性的:如果在初始渲染时条件为假,则什么也不做——直到条件第一次变为真时,才会开始渲染条件块。

  • v-show 就简单得多——不管初始条件是什么,元素总是会被渲染,只有 CSS display 属性会被切换。

  • 选择:总的来说,v-if 有更高的切换开销,而 v-show 有更高的初始渲染开销。因此,如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。