Vue3 入门教程
条件渲染
本教程共 40 篇 · 第 8 篇 · 更新于 2026-07-29 · 约 5 分钟阅读
VueVue3 入门教程v-ifv-elsev-show条件渲染
8. 条件渲染
本节目标:学会 v-if、v-else、v-show 控制元素显隐,理解它们的区别和适用场景。
v-if
v-if 根据条件渲染或销毁元素:
<h1 v-if="awesome">Vue is awesome!</h1>
条件为 truthy 时渲染,falsy 时完全移除。
v-else
v-else 表示 v-if 的”else 块”:
<button @click="awesome = !awesome">切换</button>
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>
Note
v-else元素必须紧跟在v-if或v-else-if后面,否则不识别。
v-else-if
v-else-if 是”else if”,可以链式使用:
<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>
同样,v-else-if 必须紧跟在 v-if 或另一个 v-else-if 后面。
template 包装多元素
v-if 只能绑定一个元素。要切换多个元素怎么办?用 <template> 当隐形包装器:
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
最终渲染结果不包含 <template>,它只是个占位。v-else 和 v-else-if 也能用在 <template> 上。
v-show
另一个控制显隐的指令是 v-show:
<h1 v-show="ok">Hello!</h1>
区别在于:v-show 的元素始终存在 DOM 里,只是切换 display CSS 属性。
v-show 不支持 <template>,也不支持 v-else。
v-if vs v-show
怎么选?看这个对比:
| v-if | v-show | |
|---|---|---|
| 切换频率 | 低 | 高 |
| 初始渲染成本 | 低(不渲染就是没有) | 高(始终渲染) |
| 切换成本高 | 是(销毁/重建) | 否(只改 display) |
| 懒渲染 | 是 | 否 |
- v-if 是”真正”的条件渲染——条件切换时事件监听器和子组件会正确销毁重建。初始条件为 false 时什么都不做。
- v-show 只是 CSS 切换——不管初始条件如何都会渲染。
Tip频繁切换用
v-show,运行时条件很少改变用v-if。
v-if 与 v-for
不推荐在同一个元素上同时用 v-if 和 v-for,因为 v-if 优先级更高。这意味着 v-if 拿不到 v-for 作用域的变量:
<!-- 会报错:todo 未定义 -->
<li v-for="todo in todos" v-if="!todo.isComplete">
{{ todo.name }}
</li>
正确做法——把 v-for 移到 <template> 上:
<template v-for="todo in todos">
<li v-if="!todo.isComplete">
{{ todo.name }}
</li>
</template>
本节回顾
v-if条件为 truthy 渲染,falsy 销毁v-else、v-else-if链式条件判断<template>包装多元素条件渲染v-show用 CSS 切换,元素始终在 DOM- 频繁切换用
v-show,少切换用v-if - 别同时用
v-if和v-for在同一元素上