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-elsev-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 避免「条件污染」

在复杂组件中,过多的条件嵌套可能导致代码可读性下降。推荐使用以下策略:

  1. 提取组件:将条件逻辑封装为独立组件
  2. 计算属性:将复杂条件表达式转为计算属性
  3. 状态管理:通过 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 条件未生效的排查步骤

当条件语句没有按预期渲染时,可按以下顺序排查:

  1. 检查变量是否为响应式(是否用 ref/reactive 声明)
  2. 确认表达式逻辑是否正确(如 ===== 的区别)
  3. 使用 console.log 输出变量值验证状态
  4. 检查是否有其他指令(如 v-for)干扰渲染

5.2 与 CSS 混合使用时的优先级

v-ifv-show 与 CSS 类同时作用时,需注意:

  • v-if 优先级高于 v-show
  • 内联样式会覆盖 CSS 类定义
<template>  
  <div v-if="isShown" :class="{ active: isActive }" style="color: red;">内容</div>  
</template>  

结论

Vue 3 的条件语句体系通过 v-ifv-elsev-show 等指令,构建了灵活且高效的动态渲染能力。从基础的「显示/隐藏」控制,到复杂的多分支逻辑,开发者可以通过本文介绍的语法、案例和优化策略,系统性掌握 Vue 3 条件语句的核心用法。无论是构建用户登录状态切换、权限分级系统,还是动态组件加载场景,都可借助这些工具实现优雅的解决方案。

最后提醒:在实际开发中,建议优先使用 v-if 处理高频切换场景,并通过代码拆分和状态管理提升可维护性。掌握条件语句的底层逻辑,将帮助你在 Vue 开发中更加得心应手。

最新发布