Vue条件渲染之v-if、v-else-if、v-else的完整指南

 更新时间:2026年03月02日 09:38:11   作者:局i  
v-if和v-else是Vue.js中的控制指令,用于条件性地渲染一块内容,这些内容只会在指令表达式返回真值时才会渲染,这篇文章主要介绍了Vue条件渲染之v-if、v-else-if、v-else的完整指南,需要的朋友可以参考下

前言

在 Vue 开发中,条件渲染是实现动态视图的核心能力之一。v-ifv-else-ifv-else指令组合,构成了 Vue 中强大的条件判断体系,能够根据不同状态灵活控制 DOM 的渲染逻辑。本文将深入解析这组指令的用法、特性及最佳实践,帮助你精准掌握条件渲染的精髓。

一、v-if:基础条件渲染的 “开关”

v-if是 Vue 中最基础的条件渲染指令,其核心作用是根据表达式的真假值,决定是否渲染元素及其子元素。当表达式返回true时,元素会被渲染到 DOM 中;返回false时,元素则会被完全销毁。

基本用法

<div id="app">
  <div v-if="isLogin">
    <h3>欢迎回来,{{ username }}!</h3>
    <button>退出登录</button>
  </div>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    isLogin: true,
    username: 'Vue开发者'
  }
});
</script>

在上述示例中,当isLogintrue时,欢迎语和退出按钮会被渲染;若isLogin变为false,这部分 DOM 会被直接移除。

特性:惰性渲染

v-if遵循 “惰性渲染” 原则 —— 初始条件为false时,元素不会被渲染,直到条件首次变为true,才会创建并插入 DOM。这一特性有助于优化初始渲染性能,尤其适合无需立即显示的内容(如权限控制模块)。

二、v-else-if:多条件分支的 “选择器”

当需要处理多个条件分支时,v-else-if可作为v-if的补充,实现多条件递进判断。它必须紧跟在v-if或另一个v-else-if之后,且表达式需按顺序判断。

基本用法

<div id="app">
  <div v-if="score >= 90">优秀</div>
  <div v-else-if="score >= 80">良好</div>
  <div v-else-if="score >= 60">及格</div>
  <div v-else>不及格</div>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    score: 85
  }
});
</script>

上述代码会根据score的值,依次判断并渲染对应的等级。v-else-if的判断具有排他性,一旦某个条件满足,后续分支将不再执行。

注意事项

  • v-else-if不能单独使用,必须与v-if配合;
  • 多个v-else-if需按逻辑顺序排列,避免条件覆盖(如先判断>=60再判断>=90会导致逻辑错误)。

三、v-else:条件分支的 “兜底方案”

v-else用于设置条件判断的最后默认分支,当所有前置v-ifv-else-if条件均不满足时,渲染v-else对应的元素。它必须紧跟在v-ifv-else-if之后,且无需绑定表达式。

基本用法

<div id="app">
  <button @click="toggleStatus">切换状态</button>
  <p v-if="status === 'loading'">加载中...</p>
  <p v-else-if="status === 'success'">操作成功!</p>
  <p v-else>操作失败,请重试</p>
</div>

<script>
new Vue({
  el: '#app',
  data: {
    status: 'loading'
  },
  methods: {
    toggleStatus() {
      const statusList = ['loading', 'success', 'error'];
      const currentIndex = statusList.indexOf(this.status);
      this.status = statusList[(currentIndex + 1) % 3];
    }
  }
});
</script>

点击按钮切换status时,视图会根据不同状态渲染对应提示,v-else作为最终兜底,处理所有未匹配的情况。

四、v-if、v-else-if、v-else 的核心特性

1. DOM 的动态创建与销毁

这组指令通过创建 / 销毁 DOM 元素实现条件渲染,而非简单的样式隐藏。例如,当v-if条件从true变为false时,元素会被从 DOM 树中移除并销毁,其内部的组件实例也会被销毁;条件恢复true时,元素会重新创建并触发组件的生命周期钩子。

2. 模板元素的使用

若需同时控制多个元素的条件渲染,可使用<template>标签包裹,避免额外 DOM 节点的生成:

<template v-if="hasPermission">
  <div>模块A</div>
  <div>模块B</div>
</template>

<template>仅作为逻辑容器,最终渲染时不会出现在 DOM 中。

3. 与key的配合

当在同一位置切换不同条件的元素时,Vue 可能会复用 DOM 节点以优化性能,这可能导致输入框等组件的状态残留。通过添加唯一key可强制 Vue 销毁并重建元素:

<div v-if="isUser">
  <input placeholder="用户名" key="user-input">
</div>
<div v-else>
  <input placeholder="邮箱" key="email-input">
</div>

五、使用场景与最佳实践

1. 权限控制

根据用户角色渲染不同功能模块:

<div v-if="role === 'admin'">管理员面板</div>
<div v-else-if="role === 'editor'">内容编辑页</div>
<div v-else>访客视图</div>

2. 状态提示

展示接口请求的不同状态:

<div v-if="loading">加载中...</div>
<div v-else-if="error">请求失败:{{ errorMsg }}</div>
<div v-else>数据加载完成:{{ data }}</div>

3. 复杂表单逻辑

根据表单类型切换不同输入项:

<div v-if="formType === 'login'">
  <input placeholder="用户名">
  <input placeholder="密码">
</div>
<div v-else-if="formType === 'register'">
  <input placeholder="手机号">
  <input placeholder="验证码">
</div>
<div v-else>
  <input placeholder="邮箱">
</div>

4. 性能优化建议

  • 避免在频繁切换的场景中使用:若条件需高频切换(如 tab 切换),建议使用v-show(通过 CSS 控制显示 / 隐藏),减少 DOM 操作开销;
  • 条件表达式简化:复杂条件可通过计算属性封装,提升代码可读性:
    computed: {
      showPremiumContent() {
        return this.isVip && this.hasPaid && !this.expired;
      }
    }
    

    html

    预览

    <div v-if="showPremiumContent">会员专属内容</div>
    

六、与 v-show 的对比

特性v-if 系列指令v-show
实现方式创建 / 销毁 DOM 元素修改 CSS 的 display 属性
初始渲染性能条件为 false 时无渲染开销无论条件如何都渲染元素
切换性能切换开销高(DOM 操作)切换开销低(仅修改样式)
适用场景低频切换、复杂条件分支高频切换、简单显示隐藏

七、总结

v-ifv-else-ifv-else构成了 Vue 中灵活的条件渲染体系,通过动态创建 / 销毁 DOM 实现视图的精准控制。掌握它们的特性:

  • v-if是基础条件判断,支持惰性渲染;
  • v-else-if处理多分支逻辑,需按顺序排列;
  • v-else作为兜底分支,简化默认情况处理。

到此这篇关于Vue条件渲染之v-if、v-else-if、v-else完整指南的文章就介绍到这了,更多相关Vue条件渲染v-if、v-else-if、v-else内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue移动端实现手指滑动效果

    vue移动端实现手指滑动效果

    这篇文章主要为大家详细介绍了vue移动端实现手指滑动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • vue contextmenujs鼠标右键菜单高度不够显示不全的问题及解决方法

    vue contextmenujs鼠标右键菜单高度不够显示不全的问题及解决方法

    这篇文章主要介绍了使用vue-contextmenujs鼠标右键菜单时,当高度不够时显示不全的问题,大家需要注意本文给提供的解决方案虽然能够解决现有问题,但是如果组件升级了,想要使用最新升级后的组件,还要再次修改代码,需要的朋友可以参考下
    2022-07-07
  • ElementUI之表格toggleRowSelection选中踩坑记录

    ElementUI之表格toggleRowSelection选中踩坑记录

    这篇文章主要介绍了ElementUI之表格toggleRowSelection选中踩坑记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • JavaScript实现简单的图片切换功能(实例代码)

    JavaScript实现简单的图片切换功能(实例代码)

    这篇文章主要介绍了JavaScript实现简单的图片切换功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-04-04
  • vue如何获取光标位置

    vue如何获取光标位置

    这篇文章主要介绍了vue获取光标位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • VScode中配置ESlint+Prettier详细步骤(附图文介绍)

    VScode中配置ESlint+Prettier详细步骤(附图文介绍)

    这篇文章主要介绍了VScode中配置ESlint+Prettier详细步骤,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-12-12
  • vue-cli3中如何打包成zip压缩文件

    vue-cli3中如何打包成zip压缩文件

    这篇文章主要介绍了vue-cli3中如何打包成zip压缩文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 浅析Vue中method与computed的区别

    浅析Vue中method与computed的区别

    在new Vue的配置参数中的computed和methods都可以处理大量的逻辑代码,但是什么时候用哪个属性,要好好区分一下才能做到正确的运用vue。这篇文章主要介绍了Vue中method与computed的区别,需要的朋友可以参考下
    2018-03-03
  • vue数据变化但页面刷新问题

    vue数据变化但页面刷新问题

    这篇文章主要介绍了vue数据变化但页面刷新问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • vue中保留字符串中的空格完美解决方案

    vue中保留字符串中的空格完美解决方案

    这篇文章主要介绍了vue中保留字符串中的空格的解决方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06

最新评论