v-if、v-else-if与v-else按书写顺序依次判断并排他渲染,仅首个为真的分支生效;适用于权限控制、流程步骤等需DOM重建的场景,较v-show更安全且节省资源。

v-if、v-else-if 与 v-else 是 Vue 中构成条件链的三件套,它们不按“优先级”执行,而是严格按**书写顺序依次判断、排他渲染**——一旦某个条件为真,后续分支就不再检查,也不会渲染。
条件链的执行逻辑
这组指令模拟的是 JavaScript 的 if-else if-else 流程,不是 CSS 那种层叠优先级。关键规则有:
- v-else-if 必须紧接在 v-if 或另一个 v-else-if 后面,不能单独存在
- v-else 必须紧接在 v-if 或 v-else-if 后面,且不带表达式
- 整个链中最多只渲染一个分支,哪怕多个条件同时为真,也只取第一个匹配项
- 条件表达式支持任意合法的 JS 布尔运算(如 user.role === 'admin' && user.status === 'active')
v-if/v-else-if/v-else 的典型适用场景
适合**状态相对稳定、切换不频繁、或涉及权限/流程阶段控制**的场景:
- 用户角色区分:管理员、编辑、访客显示不同操作区,权限变更后整块 DOM 重置更安全
- 表单步骤引导:如注册流程的「填写信息 → 验证邮箱 → 设置密码」,每步内容差异大,销毁重建可清空内部状态
- 错误状态兜底:网络请求失败时显示错误页,加载中显示骨架屏,成功后渲染主内容——三者互斥且生命周期独立
- 初始化惰性加载:比如后台管理侧边栏菜单,仅当用户登录且有对应权限时才创建 DOM,节省首屏资源
为什么不用 v-show 替代?
v-show 只是切 display 样式,DOM 始终存在。而 v-if 真实销毁/重建节点,带来两个不可替代的优势:
立即学习“前端免费学习笔记(深入)”;
- 安全性:v-show 隐藏的管理按钮仍存在于 DOM 中,可能被手动触发或爬虫抓取;v-if 则彻底移除,适合敏感功能
- 资源控制:含视频、图表、富文本编辑器的模块,用 v-if 可释放其事件监听器、定时器、内存占用
- 组件实例隔离:配合 key 使用时,能强制重建子组件(例如切换登录类型时清空 input 内容)
容易踩坑的细节
实际写代码时要注意这些隐性约束:
- 多个 v-else-if 的顺序必须符合逻辑层级,比如先判 score >= 90,再判 score >= 80;若反过来,高分永远进不了第一分支
- 不要跨元素使用:v-if 和 v-else-if 必须是兄弟节点,中间插入其他元素会导致 v-else-if 失效
- 想控制一组元素?用 <template> 包裹,它不会出现在最终 DOM 中,但能承载 v-if 指令
- v-if 不能和 v-for 在同一元素上共用(Vue 3 已禁止),需外层套 template 或提取为计算属性


















