v-if 和 v-show 怎么选?能和 v-for 一起用吗?
先理解原理和示例,再练习完整口述与追问。
回答要点
v-if 创建 / 销毁分支,v-show 保留节点并通过显示样式切换。频繁切换与初始成本要权衡。同节点混用 v-if / v-for 不利于理解,Vue2 与 Vue3 的优先级也不同;用计算属性预筛选或外层分组。
原理拆解
v-if 决定分支是否创建和保留,条件切换会触发相关组件创建或销毁;v-show 通常保持实例和 DOM,只改变显示方式。因此较少出现、创建成本可接受的分支适合 v-if,频繁切换且需保留状态时可考虑 v-show。隐藏后定时器和网络订阅是否继续运行,还需业务主动管理。
示例与推演
Vue2 同节点 v-for 优先,v-if 可以看到循环变量,但会让职责混乱;Vue3 同节点 v-if 优先,循环变量在这个判断阶段可能不可用。更清晰的方式是先 computed 得到 filteredRows,再对结果 v-for,或把 v-if 放到外层容器/合适 template 上,不把两个指令堆在同一节点。
易错点
v-show 不适合 template,也不能因为元素看不见就认为后台任务停止。频繁切换时还需评估 DOM 数量、内存和可访问性,而不是只背“一个懒一个不懒”。
参考回答可直接练习口述
v-if 为假时不渲染分支,切换会创建和销毁节点及组件;v-show 会保留内容,通过 display 控制可见性。高频切换且保留状态时常选 v-show,初始不需要创建的重内容可用 v-if。两者不要与 v-for 写在同一节点:Vue2 中 v-for 优先,Vue3 中 v-if 优先,移植时还可能访问不到循环变量。先筛选数据或使用外层 template 更清楚。
面试官可能继续问追问与完整解答展开收起
追问
切换后表单状态为什么丢了?隐藏组件里的监听和定时器会停止吗?
追问回答
v-if 销毁实例后,本地表单状态会随实例丢失,除非状态由父级或缓存保存。v-show 仅隐藏,监听、定时器和计算仍可能运行;要按可见性显式暂停不必要工作,不能把隐藏等同于卸载。