Code前端首页关于Code前端联系我们

Vue2里的v-if怎么用?和v-show有啥区别?还有哪些细节要注意?

terry 6小时前 阅读数 9 #Vue
文章标签 if;vshow

在Vue2开发里,v-if是高频使用的指令之一,不管是做权限控制、条件渲染页面模块,还是处理交互逻辑,都离不开它,但新手常纠结“v-if咋用才对?和v-show选哪个?嵌套、和v-for一起用有啥坑?”这些问题,今天咱就把Vue2中v-if的关键知识点拆成一个个问题,用大白话讲透!

v-if最基础的用法是啥?

v-if是Vue的条件渲染指令,核心逻辑是“条件满足就把元素(或组件)渲染到DOM里,不满足就销毁对应的DOM”。

举个最直观的例子:做用户登录状态判断,假设data里有个isLogin属性,值为true表示已登录,false是未登录,代码可以这么写:

<div v-if="isLogin">欢迎回来,{{ username }}</div>
<button v-else>点击登录</button>

这里注意两点:

  • 第一,v-if后面跟JS表达式,像isLogin这种布尔值可以用,也能写复杂判断(比如v-if="user.role === 'admin'"判断用户角色);
  • 第二,能配合v-else-ifv-else使用,但得相邻且结构连续
    <div v-if="type === 'A'">显示A类型内容</div>
    <div v-else-if="type === 'B'">显示B类型内容</div>
    <div v-else>默认内容</div>

要是想同时控制多个元素的显示隐藏,不用给每个元素都加v-if,用<template>当“容器”更方便,比如表单里的手机号、验证码输入框,只有用户选了“手机登录”才显示:

<template v-if="loginType === 'phone'">
  <input type="text" placeholder="手机号">
  <input type="text" placeholder="验证码">
</template>

这里<template>不会被渲染成真实DOM节点,只负责分组逻辑,很适合批量控制元素~

v-if和v-show核心区别是啥?该咋选?

很多人刚学Vue时,总搞不清这俩指令,其实核心差异在DOM的渲染机制性能开销上。

先看渲染机制
v-if是“动态增删DOM”——条件不满足时,对应的DOM会被完全销毁;条件满足时,重新创建DOM。
v-show是“切换CSS的display属性”——不管条件是否满足,DOM一开始就存在,只是用display: none把它藏起来。

再聊性能开销
初始渲染时,v-show因为DOM已经存在,只是隐藏,所以比v-if(要判断条件、创建/销毁DOM)更快;但切换的时候,v-show只是改CSS,开销很小;v-if每次切换都要销毁/重建DOM,开销更大。

所以场景选择很明确:

  • 如果模块切换特别频繁(比如tab栏切换、弹窗频繁显示隐藏),选v-show,减少DOM操作开销;
  • 如果模块默认不显示,且切换次数少(比如权限控制的管理员菜单、首屏隐藏的广告位),选v-if,因为初始渲染时不加载多余DOM,节省首屏性能;
  • 还有个细节:v-show不能用在<template>上,也不支持v-else系列,这点和v-if不一样~

v-if在