根据2025-2026年的前端面试趋势,Vue面试题的重心已完全转向 Vue 3、Composition API、性能优化以及底层原理。以下我为你整理的精选高频面试题,分为基础、进阶、原理和生态四个维度,并附带了核心考点解析。
一、Vue 3 核心与 Composition API (必考)
1. Vue 2 和 Vue 3 的主要区别是什么?
- 响应式原理: Vue 2 使用
Object.defineProperty,无法监听对象属性的新增/删除及数组索引变化;Vue 3 使用Proxy,支持动态添加属性、数组索引监听,性能更好。 - API 风格: Vue 2 是 Options API (data, methods, mounted);Vue 3 主推 Composition API (
setup,ref,reactive),逻辑复用更灵活。 - 生命周期: Vue 3 中生命周期钩子前加了
on(如onMounted),且beforeDestroy改为beforeUnmount。 - Fragment/Teleport/Suspense: Vue 3 支持多根节点、 teleport (传送门) 和 异步组件挂起。
- TypeScript 支持: Vue 3 源码重写为 TS,类型推导更友好。
2. ref 和 reactive 的区别?如何选择?
-
区别:
ref:用于定义基本数据类型(也可定义对象),访问值需要通过.value。底层若为对象则自动转为reactive。reactive:用于定义对象或数组,基于 Proxy 实现,直接访问属性,无需.value。
-
选择建议:
- 优先使用
ref,因为统一使用.value在代码跳转和重构时更一致,且避免了解构丢失响应性的问题(reactive解构需配合toRefs)。 - 若数据层级较深且不需要替换整个对象,可用
reactive。
- 优先使用
3. 什么是 Composition API?它解决了什么问题?
-
定义: 一组基于函数的 API,允许我们将组件逻辑按“功能”组织(如:搜索逻辑、分页逻辑),而不是按“选项”组织。
-
解决的问题:
- 逻辑复用: 替代 Mixins,避免命名冲突和来源不清晰。
- 代码组织: 大型组件中,同一功能的代码(data/methods/watch)分散在不同位置,Composition API 让相关代码聚在一起。
- 类型推导: 对 TypeScript 支持更好。
4. watch 和 watchEffect 的区别?
watch: 懒执行(只有数据变化才执行),需要明确指定监听源,可以获取新旧值 (newVal,oldVal)。适合依赖特定变量变化执行副作用。watchEffect: 立即执行,自动收集依赖(函数内用到的响应式变量都会成为依赖),无法获取旧值。适合一次性执行或依赖不确定的场景。
二、响应式原理与底层 (高频难点)
5. 请详细描述 Vue 3 的响应式原理 (Proxy)。
- 使用
Proxy代理整个对象,拦截get,set,deleteProperty等操作。 - Get 拦截: 进行依赖收集(Track),将当前激活的副作用函数(effect)存入目标属性的依赖集合(Dep)中。
- Set 拦截: 修改值后,触发依赖更新(Trigger),执行之前收集的副作用函数。
- 优势: 相比 Vue 2 的递归遍历
Object.defineProperty,Proxy 是懒代理(只有访问嵌套对象时才会递归代理),性能更高,且能监听数组和动态属性。
6. Vue 2 的响应式缺陷有哪些?如何解决?
- 缺陷: 无法检测对象属性的添加/删除;无法检测通过索引修改数组元素。
- 解决: 使用
Vue.set(或this.$set) 和Vue.delete。在 Vue 3 中这些限制已消失。
7. nextTick 的原理和作用是什么?
- 作用: 在下次 DOM 更新循环结束之后执行延迟回调。用于在修改数据之后立即获取更新后的 DOM。
- 原理: Vue 将多个数据变更放入一个队列,缓冲在同一事件循环tick中。
nextTick利用 Promise (微任务) 或 MutationObserver/setTimeout (宏任务) 机制,确保回调在 DOM 更新后执行。
三、组件通信与状态管理
8. Vue 组件间通信的方式有哪些?(全场景)
- 父子:
props/$emit,$parent/$children(不推荐),ref。 - 兄弟/跨级: EventBus (Vue 3 已移除
$on,需用第三方库如 mitt),Provide / Inject。 - 任意组件: Vuex / Pinia (推荐)。
- 透传:
$attrs/$listeners(Vue 3 中 listeners 合并到 attrs)。
9. Pinia 和 Vuex 的区别?为什么 Vue 3 推荐 Pinia?
- 架构: Pinia 去除了
mutation,只有state,getters,actions,流程更简单。 - 体积: Pinia 更小 (约 1KB)。
- TS 支持: Pinia 对 TypeScript 支持极佳,无需复杂的包装。
- 模块化: Pinia 没有嵌套模块概念,每个 store 独立,支持代码分割。
- Devtools: 集成更好,支持时间旅行调试。
四、路由与性能优化 (实战重点)
10. Vue Router 的 Hash 模式和 History 模式有什么区别?
- Hash: URL 带
#,内容不发送给服务器,兼容性好,无需后端配置。 - History: URL 美观 (如
/user/1),利用 HTML5 History API (pushState)。注意: 刷新页面时若后端未配置重定向(fallback)到index.html,会报 404 错误。
11. 如何优化 Vue 应用的首屏加载速度?
- 路由懒加载:
component: () => import('./views/Home.vue')。 - 组件懒加载: 使用
defineAsyncComponent或<Suspense>。 - 第三方库按需引入: 如 Element Plus, Lodash。
- Gzip/Brotli 压缩: 开启服务器压缩。
- CDN 加速: 将静态资源托管到 CDN。
- SSR (服务端渲染): 使用 Nuxt.js 提升首屏 SEO 和加载体验。
- 虚拟列表: 长列表数据使用
vue-virtual-scroller减少 DOM 节点。
12. key 的作用是什么?为什么不建议用 index 作为 key?
- 作用: 帮助 Vue 的 Diff 算法高效识别 VNode,判断是复用还是创建新节点。
- 不用 index 的原因: 当列表顺序发生变化(如排序、删除中间项)时,使用 index 会导致 Vue 错误地复用组件状态(如输入框内容错乱),或进行不必要的 DOM 移动操作,影响性能和正确性。应使用唯一 ID。
五、2026年面试特别关注点 (新趋势)
13. Vue 3.3+ / 3.4+ 的新特性了解吗?
defineModel(3.4): 简化了双向绑定 props 的定义,不再需要手动 emit update 事件。v-bind简写: 支持v-bind="{ ... }"的更多场景。- Slots 类型推导: 对插槽的 TS 支持更完善。
- 响应式语法糖 (实验性): 虽然
$ref语法糖被暂时搁置,但了解其争议和官方态度(坚持显式.value)也是加分项。
14. 在大型项目中如何组织 Composition API 代码?
- Composables 模式: 将逻辑抽取为
useXxx.ts文件(如useUser,useTable)。 - 约定: 函数名以
use开头,返回响应式对象或方法。 - 注意: 避免在
setup外部调用 hooks,确保上下文正确。
这些题目覆盖了目前大厂面试的核心考点,建议结合自己的项目经验进行深入理解,而不仅仅是背诵答案。