Vue2 中 v-if 与 v-show 深度对比及实战指南

文章目录

一、核心差异解析

对比维度 v-if v-show
控制原理 动态创建 / 销毁 DOM 元素 修改 display 样式(隐藏为 none)
模板支持 可用于<template>分组元素 不支持<template>标签
初始渲染 惰性加载(假时不渲染) 必渲染 DOM(仅隐藏)
切换成本 高(重建组件 / 解绑事件) 低(仅改样式)
内存占用 隐藏时释放内存 始终占用内存
v-else 配合 支持链式 v-else-if/v-else 仅 Vue1.x 支持,Vue2 不兼容

二、实战场景示例

2.1 基础用法对比

javascript 复制代码
    <!-- v-if 支持多元素分组 -->

    <template v-if="hasPermission">

         <button>编辑    </button>

         <button>删除    </button>

    </template>

    <div v-else>无操作权限    </div>

    <!-- v-show 单元素控制 -->

    <div v-show="isVisible">始终存在于DOM中    </div>

2.2 性能影响示例

javascript 复制代码
    <template>

         <!-- 首屏优化:v-if减少DOM节点 -->

         <AdvancedChart v-if="showChart" />    

         <!-- 错误:v-show导致首屏DOM超3000个 -->

         <!--     <AdvancedChart v-show="showChart" /> -->

    </template>

    <script>

// 查看DOM节点数(控制台调试)

console.log(    $    $("    *").length); // 监控v-show造成的节点冗余

    </script>

2.3 条件链用法

javascript 复制代码
    <!-- v-if 条件链(Vue2推荐) -->

    <div v-if="type === 'A'">类型A    </div>

    <div v-else-if="type === 'B'">类型B    </div>

    <div v-else>其他类型    </div>

    <!-- v-show 无原生条件链 -->

    <div v-show="type === 'A'">类型A    </div>

    <div v-show="type === 'B'">类型B    </div>

三、避坑与最佳实践

  1. 高频切换选 v-show:标签页、开关等交互场景,利用低切换成本提升流畅性。

  2. 首屏 / 低频场景选 v-if:弹窗、权限控件等,减少初始 DOM 节点和内存占用。

  3. 避免 v-if 与 v-for 混用:先通过 computed 过滤数据,再用 v-for 渲染。

javascript 复制代码
computed: {

     filteredList() {

       return this.list.filter(item => item.visible);

     }

}
相关推荐
企业数字化笔记4 分钟前
新租户注册成功却不能用?开通状态、初始化恢复与可用性验收
开发语言·python
瑶山8 分钟前
Windows + WSL2 Ubuntu + VS Code配置C++开发环境
开发语言·c++·windows·vscode·wsl
小番茄夫斯基11 分钟前
如果我一个前端页面要被用户看到,原理是什么,用户怎么通过网址就看到页面的,这背后要怎么弄
前端
迅猛龙办公室15 分钟前
Python实现获取星期字符串
java·前端·python
Vertira16 分钟前
C# 函数封装成 DLL,
开发语言·c#
小小荧17 分钟前
🚀 Node.js 之父离开 Deno,带着整个团队加入了 Cloudflare
前端·node.js
IllegalCreed17 分钟前
人中吕布,卡中 Blackwell:我用三国志14的数值给 687 个大模型排了座位
前端
troy12819 分钟前
Java Web 常见面试题(2026 最新整理)
java·前端·hive
开开心心就好20 分钟前
一元二次方程求解工具,答案带详细步骤
java·服务器·开发语言·算法·pdf·ocr·perl