六维教程

Vue3 条件渲染

页面要不要显示某块内容,往往取决于数据条件。

没登录显示”登录”,登录了显示”退出”;购物车为空显示”空空如也”,否则显示列表。

Vue 用 v-if 系列和 v-show 来处理。

v-if:条件渲染

v-if 后面跟一个布尔表达式,为真才渲染;为假整块元素不渲染(DOM 里根本不存在):

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

const status = ref('loading')
</script>

<template>
  <p v-if="status === 'loading'">加载中…</p>
  <p v-else-if="status === 'error'">加载失败,请重试</p>
  <p v-else>加载完成</p>
</template>

三个要点:

  • v-else-ifv-else 必须紧跟在前一个 v-if/v-else-if 元素的后面,中间不能插别的元素,否则 Vue 匹配不上。
  • v-else 不需要写判断条件,它表示”剩下的情况”。
  • 判断条件可以是比较运算、变量、方法返回值等任何”能得出布尔值的表达式”。

多个元素

v-if 只能作用于一个元素,想一起控制多个元素,把它们装进 <template><template>不会渲染成任何 HTML 标签:

<template v-if="isLogin">
  <p>欢迎回来,{{ user.name }}</p>
  <button @click="logout">退出登录</button>
</template>

特殊取值

v-if="0"v-if="''" 会怎样?

0''nullundefined 在 JS 里都是”假值”,会被当作不渲染。

习惯上建议写明确的布尔判断(如 v-if="count > 0"),代码更好读。

v-show:切换 display

v-show 的用法和 v-if 一样,但实现完全不同,为假时元素依然渲染,只是 display: none 隐藏起来。

<p v-show="isVisible">始终存在于页面,只是被隐藏</p>

v-show 不支持 <template> 包裹,也没有 v-else 配套。

v-show 不能用在 <template> 上,因为<template> 不产生真实元素,display: none 无处安放;多元素高频切换时,考虑把内容拆成子组件或直接用 v-if

v-if vs v-show 怎么选

对比维度 v-if v-show
实现方式 条件为假时不渲染元素 始终渲染,只是 display: none
初始开销 为真时才创建,初始省资源 无论真假都创建,初始消耗更大
切换开销 每次切换都在销毁/重建 DOM 只改样式,切换开销小
配套语法 v-else-if / v-else / <template>
适用场景 很少切换、条件要”彻底不出现”的内容 频繁切换(弹层、折叠面板、Tab 类)

速查卡片

场景 写法
单条件 v-if="条件"
多分支 v-ifv-else-ifv-else(必须连续)
多元素同进退 <template v-if="条件">…</template>
高频切换的隐藏/显示 v-show="条件"
上一篇
Vue3 计算与侦听
下一篇
Vue3 列表渲染