news 2026/5/12 21:05:51

前端八股Vue(6)---v-if和v-for

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
前端八股Vue(6)---v-if和v-for

目录

  • 一、v-for 详解
  • 1.1 作用
  • 1.2 语法
  • 1.3 要点
  • 二、v-if 详解
  • 2.1 作用
  • 2.2 语法
  • 2.3 v-if vs v-show
  • 三、高频面试坑点:v-for 和 v-if 不能用在同一个标签上
  • 3.1 错误示例
  • 3.2 原因
  • 3.3 正确写法
  • 四、v-for 里面的 key 作用
  • 4.1 一句话核心答案
  • 4.2 详细解释
  • 4.3 图解:有 key vs 无 key
  • 4.4 为什么不能用 index 做 key?(高频考点)
  • 五、面试标准满分回答
  • Q1:v-for 和 v-if 为什么不能一起用?
  • Q2:v-for 中的 key 有什么作用?为什么不能用 index?
  • 六、总结对比表

一、v-for 详解

1.1 作用

v-for 是循环指令,用于遍历数组或对象渲染列表,必须绑定 key 提升性能。

1.2 语法

<template> <!-- 遍历数组 --> <div v-for="(item, index) in list" :key="index"> {{ item }} </div> <!-- 遍历对象 --> <div v-for="(value, key, index) in obj" :key="key"> {{ key }}: {{ value }} </div> <!-- 遍历数字(1-10) --> <div v-for="n in 10" :key="n">{{ n }}</div> <!-- 遍历字符串 --> <div v-for="char in 'hello'" :key="char">{{ char }}</div> </template>

1.3 要点

要点说明
必须绑定 key提高 Vue 复用 DOM、diff 效率
可遍历类型数组、对象、数字、字符串
参数顺序数组:(item, index);对象:(value, key, index)

二、v-if 详解

2.1 作用

v-if 是条件渲染指令,根据表达式真假创建或销毁 DOM。

2.2 语法

<template> <!-- 单独使用 --> <div v-if="isShow">显示</div> <!-- v-else --> <div v-if="isLogin">欢迎回来</div> <div v-else>请先登录</div> <!-- v-else-if --> <div v-if="status === 'success'">成功</div> <div v-else-if="status === 'loading'">加载中</div> <div v-else>失败</div> <!-- 支持 template 批量渲染 --> <template v-if="isShow"> <h2>标题</h2> <p>内容</p> </template> </template>

2.3 v-if vs v-show

对比v-ifv-show
控制方式创建/销毁 DOM切换 display: none
DOM 存在性假时不存在始终存在
切换开销
初始开销低(假时不渲染)高(总是渲染)
支持 template
支持 v-else
适用场景很少切换频繁切换

三、高频面试坑点:v-for 和 v-if 不能用在同一个标签上

3.1 错误示例

<!-- ❌ 不推荐!!! --> <div v-for="item in list" v-if="item.isActive" :key="item.id"> {{ item.name }} </div>

3.2 原因

v-for 优先级比 v-if 高,会先循环全部项,再逐个判断 v-if,造成性能浪费:

// 本质执行逻辑(简化) // 即使只有 1 项符合条件,也要遍历全部 1000 条数据 list.forEach(item => { if (item.isActive) { // 渲染 DOM } })

3.3 正确写法

<!-- ✅ 方式1:在外层套 <template> --> <template v-for="item in list" :key="item.id"> <div v-if="item.isActive"> {{ item.name }} </div> </template> <!-- ✅ 方式2:提前在 computed 里过滤好数组 --> <template> <div v-for="item in activeList" :key="item.id"> {{ item.name }} </div> </template> <script setup> import { computed } from 'vue' const list = ref([...]) const activeList = computed(() => list.value.filter(item => item.isActive) ) </script> <!-- ✅ 方式3:v-show 替代(如果只是隐藏) --> <div v-for="item in list" v-show="item.isActive" :key="item.id"> {{ item.name }} </div>

四、v-for 里面的 key 作用

4.1 一句话核心答案

key 是 Vue 用来识别每个虚拟 DOM 节点的唯一标识,方便 Vue 在列表更新时做高效的 DIFF 对比,实现 DOM 复用和精准更新,提升渲染性能。

4.2 详细解释

作用说明
标识唯一性key 给每个列表项一个唯一 ID,让 Vue 知道谁是谁
提高 diff 效率有 key:Vue 能精准找到变化项,只更新该 DOM;无 key:Vue 只能暴力复用、顺序对比
避免渲染错乱删除、逆序、插入时,没有 key 容易出现复选框错位、过渡动画混乱

4.3 图解:有 key vs 无 key

无 key(索引对比): 原列表:A B C D 新列表:A C D Vue 对比: 位置0: A → A ✅ 复用 位置1: B → C ❌ 更新(但 B 应该是删除) 位置2: C → D ❌ 更新 位置3: D → 无 ❌ 删除 结果:2 次更新 + 1 次删除 有 key(id 对比): 原列表:A(id:1) B(id:2) C(id:3) D(id:4) 新列表:A(id:1) C(id:3) D(id:4) Vue 对比: id:1 存在 ✅ 复用 id:2 不存在 ❌ 删除 id:3 存在 ✅ 复用 id:4 存在 ✅ 复用 结果:1 次删除,0 次更新

4.4 为什么不能用 index 做 key?(高频考点)

<!-- ❌ 错误:用 index 做 key --> <div v-for="(item, index) in list" :key="index"> {{ item.name }} <input type="checkbox" /> </div>

问题:

操作用 index 作为 key 的问题
列表逆序index 变化,所有 key 都变了,Vue 会重新创建所有 DOM
删除/插入后续项的 index 改变,导致 DOM 复用错误
表单错位input 框的内容会错位,因为 key 变了
性能大量不必要的 DOM 更新,性能反而更差

正确做法:

<!-- ✅ 正确:用后端返回的唯一 id --> <div v-for="item in list" :key="item.id"> {{ item.name }} </div> <!-- ✅ 数据没有 id 时,可以用 Symbol 或自定义唯一标识 --> <div v-for="(item, index) in list" :key="`item-${item.name}-${item.age}`"> {{ item.name }} </div>

五、面试标准满分回答

Q1:v-for 和 v-if 为什么不能一起用?

答:因为 v-for 的优先级高于 v-if,如果写在同一个标签上,Vue 会先执行循环遍历所有数据,再对每一项进行条件判断。这样即使大部分数据都不需要渲染,也会先遍历一遍,造成性能浪费。正确的做法是用 computed 先过滤数据,或者在<template>外层包一层。

Q2:v-for 中的 key 有什么作用?为什么不能用 index?

答:key 是 Vue 虚拟 DOM diff 算法中识别节点的唯一标识。有 key 时,Vue 能精准定位变化项,只更新必要的 DOM;没有 key 时,Vue 只能按顺序对比,容易造成错误渲染和性能问题。

不能用 index 作为 key,因为当列表发生逆序、删除、插入等操作时,index 会变化,导致 Vue 认为所有节点都变了,从而无法复用 DOM,反而降低性能,还可能导致表单状态错位。应该使用后端返回的唯一 id 作为 key。


六、总结对比表

指令作用优先级必须配合注意事项
v-for循环渲染:key不要和 v-if 同标签
v-if条件渲染v-else-if/v-else切换开销大
key节点标识-配合 v-for不要用 index
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 20:25:05

详细解析Spring如何解决循环依赖问题赘

AI训练存储选型的演进路线 第一阶段&#xff1a;单机直连时代 早期的深度学习数据集较小&#xff0c;模型训练通常在单台服务器或单张GPU卡上完成。此时直接将数据存储在训练机器的本地NVMe SSD/HDD上。 其优势在于IO延迟最低&#xff0c;吞吐量极高&#xff0c;也就是“数据离…

作者头像 李华
网站建设 2026/4/16 3:27:08

【项目实践】贪吃蛇(附详细代码及配图)

小编主页详情<-请点击 小编gitee代码仓库<-请点击 本文主要介绍了项目实践中的贪吃蛇&#xff0c;内容全由作者原创&#xff08;无AI&#xff09;&#xff0c;同时深度解析了贪吃蛇每个环节及需要实现的内容&#xff0c;并带有配图帮助博友们更好的理解&#xff0c;点个关…

作者头像 李华
网站建设 2026/4/16 11:19:59

python 文件管理库 Path 解析(详细基础)狼

. GIF文件结构 相比于 WAV 文件的简单粗暴&#xff0c;GIF 的结构要精密得多&#xff0c;因为它天生是为了网络传输而设计的&#xff08;包含了压缩机制&#xff09;。 当我们用二进制视角观察 GIF 时&#xff0c;它是由一个个 数据块&#xff08;Block&#xff09; 组成的&…

作者头像 李华
网站建设 2026/4/18 0:17:08

**发散创新:基于Python的自主系统任务调度与决策优化实战**在现代人工智能与嵌入式系统的融合浪潮中,**自主系统(A

发散创新&#xff1a;基于Python的自主系统任务调度与决策优化实战 在现代人工智能与嵌入式系统的融合浪潮中&#xff0c;自主系统&#xff08;Autonomous Systems&#xff09; 正从理论走向大规模落地应用——从无人车、无人机到智能工厂设备。这类系统不仅需要感知环境、执行…

作者头像 李华
网站建设 2026/4/18 1:35:55

零门槛上手 OpenClaw:用 AI 数字手脚,把重复工作交给自动化

最近 AI 智能体圈里&#xff0c;OpenClaw凭借 “给大模型装上数字手脚” 的能力快速出圈&#xff0c;它不只是聊天 AI&#xff0c;更能直接操控电脑、手机&#xff0c;自动完成一整套流程任务。很多职场人、自媒体人已经用它解决高频痛点&#xff1a;新媒体写稿&#xff1a;自动…

作者头像 李华