v-show 通过直接操作 DOM 的 display 样式实现显隐,跳过虚拟 DOM 的 diff 和 patch 流程;初始即渲染所有元素,仅切换 display 值,适合高频切换但需注意内存常驻问题。

v-show 本身不依赖虚拟 DOM 的 patch 过程来实现切换,它绕开了“重新比对—更新节点”的流程,靠的是 CSS 层面的即时控制。
核心原理:display 切换,跳过 diff
v-show 的本质是给元素添加或移除 style="display: none"。Vue 在编译阶段就为绑定 v-show 的节点生成了对应的指令钩子;当响应式数据变化时,Vue 不会触发虚拟 DOM 的 diff 算法去比对新旧 vnode,而是直接操作真实 DOM 的 style 属性。这意味着:
- 初始渲染时,所有带 v-show 的元素都会被创建并挂载到 DOM 中(哪怕初始为 false)
- 后续切换只执行
el.style.display = value ? '' : 'none',不触发 patch 流程 - 没有 vnode 创建、diff、patch、DOM 插入/卸载等开销
与虚拟 DOM 的关系:共存但不耦合
v-show 和虚拟 DOM 并非“配合”关系,而是各司其职:
- 虚拟 DOM 负责整个组件树的结构描述和首次/条件性重渲染(如 v-if 触发时)
- v-show 是一个底层指令,在 vnode 已存在且已挂载的前提下,仅干预真实 DOM 的可见性
- 即使禁用虚拟 DOM(比如用 render 函数手写 vnode),v-show 依然生效——因为它最终操作的是真实节点
适合高频切换的典型场景
以下情况用 v-show 能真正规避 patch,获得毫秒级响应:
- Tab 栏切换(如知识库中示例:4 个面板反复切换,内容稳定、无需销毁)
- 抽屉菜单、下拉面板、提示气泡的显隐控制
- 表单步骤器中各步骤内容区的轮播(每步 DOM 结构固定)
- 图表模块的视图切换(如折线图/柱状图/饼图共用同一容器)
注意事项:别误用为“性能万能解”
v-show 省掉 patch 的代价是内存常驻:
- 所有 v-show 控制的节点始终在 DOM 树中,含子组件、事件监听器、定时器等
- 若隐藏区域含大量计算、watcher 或第三方库实例(如 ECharts 实例),需手动销毁或暂停
- 首次加载体积略大(所有内容都渲染),不适合首屏关键路径上“大概率不显示”的模块

















