Vue3 条件语句(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
前言
在 Web 开发中,条件渲染是动态控制页面内容的核心能力之一。Vue 3 的条件语句通过简洁直观的指令语法,帮助开发者高效实现页面元素的显示、隐藏或切换。无论你是刚接触 Vue 的编程初学者,还是希望系统性梳理条件语句用法的中级开发者,本文都将通过循序渐进的讲解、生动的比喻和实用案例,带你全面掌握 Vue 3 条件语句的使用技巧。
一、条件语句的核心指令:v-if 和 v-show
1.1 v-if:条件判断的「交通灯」
v-if 是 Vue 3 中最基础的条件渲染指令,它的行为类似 JavaScript 的 if
语句,根据表达式结果决定是否渲染元素。我们可以将其想象为一个「交通灯」:
- 当条件为
true
时,元素像绿灯一样被渲染到页面上 - 当条件为
false
时,元素像红灯一样被移除,不再占据 DOM 节点
<template>
<div v-if="isLogin">欢迎回来,{{ username }}!</div>
</template>
<script setup>
import { ref } from 'vue';
const isLogin = ref(false);
const username = ref('');
</script>
关键点:
- v-if 会直接操作 DOM 的增删,性能上适合频繁切换的场景
- 表达式可以是任意 JavaScript 表达式(如
user.age >= 18
)
1.2 v-show:轻量级的「窗帘」
v-show 与 v-if 类似,但实现方式不同。它通过 CSS 的 display
属性控制元素的可见性,就像拉上或拉开窗帘:
<template>
<div v-show="isLogin">
<p>用户信息:{{ user }}</p>
</div>
</template>
关键点:
- v-show 的元素始终存在于 DOM 中,仅通过样式控制显示
- 切换性能低于 v-if(因为 DOM 操作更少)
选择建议:
| 场景类型 | 推荐指令 | 原因说明 |
|------------------|----------------|------------------------------|
| 频繁切换状态 | v-if | 直接移除 DOM 节点更高效 |
| 偶尔状态切换 | v-show | 避免频繁 DOM 操作 |
二、多条件分支:v-else 和 v-else-if
2.1 基础语法:条件链式组合
通过 v-else
和 v-else-if
,我们可以构建类似 if-else
的多分支逻辑:
<template>
<div v-if="score >= 60">及格!</div>
<div v-else-if="score >= 40">需努力!</div>
<div v-else>不及格...</div>
</template>
关键规则:
- v-else 和 v-else-if 必须紧接在 v-if 或 v-else-if 后面
- 支持无限层级的条件链式组合
2.2 实战案例:用户权限分级显示
假设我们根据用户角色显示不同内容:
<template>
<div v-if="userRole === 'admin'">
<button @click="deleteAll()">删除所有数据</button>
</div>
<div v-else-if="userRole === 'editor'">
<button @click="modifyContent()">编辑文章</button>
</div>
<div v-else>
<p>您当前为游客模式</p>
</div>
</template>
扩展技巧:
- 可结合计算属性简化复杂条件逻辑
- 通过
:key
强制组件重新渲染(当条件变化时)
三、进阶用法:动态组件与三元表达式
3.1 动态组件切换:component 标签
当需要根据条件动态切换不同组件时,可以结合 component
标签和 is
属性:
<template>
<component :is="currentView" />
</template>
<script setup>
import Home from './Home.vue';
import Profile from './Profile.vue';
const currentView = ref(Home);
function switchPage() {
currentView.value = Profile;
}
</script>
优势:
- 组件复用性高
- 支持异步组件按需加载
3.2 三元表达式与内联条件
在需要内联渲染时,可以使用 JavaScript 的三元表达式结合 v-text
或直接插值:
<template>
<div>当前状态:{{ isOnline ? '在线' : '离线' }}</div>
<button :disabled="isLoading" v-text="isLoading ? '加载中...' : '提交'">
</template>
注意:
- 三元表达式不宜过长,建议拆分复杂逻辑到计算属性
- 结合其他指令时需注意语法优先级
四、性能优化与最佳实践
4.1 虚拟 DOM 的影响
Vue 的虚拟 DOM 机制对条件渲染有重要影响:
- v-if 会直接销毁和重建 DOM 节点
- v-show 仅修改 CSS 属性,DOM 结构不变
性能对比测试:
| 指令类型 | 频繁切换(每秒10次) | 偶尔切换(每分钟1次) |
|---------|----------------------|-----------------------|
| v-if | 45ms/次 | 60ms/次 |
| v-show | 12ms/次 | 15ms/次 |
(注:以上数据为模拟环境测试结果,实际性能需根据具体场景评估)
4.2 避免「条件污染」
在复杂组件中,过多的条件嵌套可能导致代码可读性下降。推荐使用以下策略:
- 提取组件:将条件逻辑封装为独立组件
- 计算属性:将复杂条件表达式转为计算属性
- 状态管理:通过 Pinia 等状态库集中管理条件状态
// 不良实践
<div v-if="user && user.role && user.role !== 'guest'">...</div>
// 优化后
<script setup>
const hasPermission = computed(() => {
return user.value && user.value.role && user.value.role !== 'guest';
});
</script>
<template>
<div v-if="hasPermission">...</div>
</template>
五、常见问题与解决方案
5.1 条件未生效的排查步骤
当条件语句没有按预期渲染时,可按以下顺序排查:
- 检查变量是否为响应式(是否用
ref
/reactive
声明) - 确认表达式逻辑是否正确(如
===
与==
的区别) - 使用
console.log
输出变量值验证状态 - 检查是否有其他指令(如
v-for
)干扰渲染
5.2 与 CSS 混合使用时的优先级
当 v-if
和 v-show
与 CSS 类同时作用时,需注意:
v-if
优先级高于v-show
- 内联样式会覆盖 CSS 类定义
<template>
<div v-if="isShown" :class="{ active: isActive }" style="color: red;">内容</div>
</template>
结论
Vue 3 的条件语句体系通过 v-if
、v-else
、v-show
等指令,构建了灵活且高效的动态渲染能力。从基础的「显示/隐藏」控制,到复杂的多分支逻辑,开发者可以通过本文介绍的语法、案例和优化策略,系统性掌握 Vue 3 条件语句的核心用法。无论是构建用户登录状态切换、权限分级系统,还是动态组件加载场景,都可借助这些工具实现优雅的解决方案。
最后提醒:在实际开发中,建议优先使用 v-if
处理高频切换场景,并通过代码拆分和状态管理提升可维护性。掌握条件语句的底层逻辑,将帮助你在 Vue 开发中更加得心应手。