这篇文章已经发布超过一年了,内容可能已经过时,请谨慎参考。
条件渲染总结
一、基础指令
-
v-if
- 功能:根据表达式真假条件渲染内容
- 特点:惰性渲染(初始为false时不渲染)
- 示例:
<h1 v-if="awesome">Vue is awesome!</h1>
-
v-else
- 功能:添加”else”逻辑块
- 规则:
- 必须紧跟v-if/v-else-if
- 中间不能插入其他元素
- 示例:
<h1 v-if="awesome">Vue is awesome!</h1>
<h1 v-else>Oh no 😢</h1>
-
v-else-if
- 功能:添加多条件判断
- 规则:
- 必须紧跟v-if/v-else-if
- 可连续多次使用
- 示例:
VUE123<div v-if="type === 'A'">A</div> <div v-else-if="type === 'B'">B</div> <div v-else>Not A/B</div>
二、标签用法
- 功能:分组渲染多个元素(不会生成实际DOM)
- 支持指令:v-if / v-else / v-else-if
- 示例:
VUE12345 <template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
三、v-show指令
- 功能:通过CSS控制显示状态
- 特点:
- 始终保留DOM元素
- 仅切换
display: none
样式
- 限制:
- 不能用于
<template>
标签
- 不能搭配v-else使用
- 示例:
Hello!
四、v-if 与 v-show 对比
特性 v-if v-show 渲染机制 条件性DOM操作 仅CSS显示控制 初始渲染开销 低(false不渲染) 高(总要渲染) 切换开销 高(重建DOM) 低(改样式) 适用场景 低频切换 高频切换
五、重要注意事项
-
执行顺序规则:
- 当同时使用
v-if
和v-for
时
v-if
会优先执行
- 推荐先用计算属性过滤数据
-
性能优化建议:
- 频繁切换(如选项卡):优先使用
v-show
- 不常变化的状态:使用v-if更合适
-
元素连续性要求:
- v-else/v-else-if
必须紧跟同级元素
- 示例错误写法:
VUE123<div v-if="..."></div>
<p>间隔元素</p> <!-- 这会中断条件链 -->
<div v-else></div>```
-
条件链完整性:
- 建议始终添加
v-else
兜底
- 防止未处理边界情况
VUE
1
2
3
4
5
<template v-if="ok">
<h1>Title</h1>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</template>
- 始终保留DOM元素
- 仅切换
display: none
样式
- 不能用于
<template>
标签 - 不能搭配v-else使用
Hello!
特性 | v-if | v-show |
---|---|---|
渲染机制 | 条件性DOM操作 | 仅CSS显示控制 |
初始渲染开销 | 低(false不渲染) | 高(总要渲染) |
切换开销 | 高(重建DOM) | 低(改样式) |
适用场景 | 低频切换 | 高频切换 |
执行顺序规则:
- 当同时使用
v-if
和v-for
时 v-if
会优先执行- 推荐先用计算属性过滤数据
性能优化建议:
- 频繁切换(如选项卡):优先使用
v-show
- 不常变化的状态:使用v-if更合适
元素连续性要求:
- v-else/v-else-if
必须紧跟同级元素
- 示例错误写法:
VUE
1
2
3
<div v-if="..."></div>
<p>间隔元素</p> <!-- 这会中断条件链 -->
<div v-else></div>```
条件链完整性:
- 建议始终添加
v-else
兜底 - 防止未处理边界情况