Vue2 和 Vue3 面试题总结
1. MVVM 和 MVC 的区别
-
MVVM(Model-View-ViewModel):
- 双向数据绑定:View 和 Model 通过 ViewModel 自动同步。
- 核心:数据驱动视图,ViewModel 负责处理业务逻辑和数据处理。
- 优点:解耦 View 和 Model,便于测试和维护。
-
MVC(Model-View-Controller):
- 单向通信:View 通过 Controller 操作 Model,Model 变化后通知 View 更新。
- 缺点:View 和 Model 未完全解耦,Controller 可能变得臃肿。
2. Vue2 和 Vue3 的主要区别
| 特性 | Vue2 | Vue3 |
|---|---|---|
| 响应式原理 | Object.defineProperty | Proxy |
| 组合式 API | Options API | Composition API |
| 生命周期 | 传统钩子(如 created) | setup + onMounted 等 |
| 性能优化 | 虚拟 DOM 全量对比 | 静态标记 + Block Tree |
| 新组件 | 无 | Fragment、Teleport、Suspense |
3. Vue3 的优势
- 性能更好:Proxy 响应式、编译优化(Block Tree)。
- 组合式 API:逻辑复用更灵活(类似 React Hooks)。
- 更好的 TS 支持:类型推断更完善。
- 体积更小:Tree-shaking 优化。
- 新特性:
Teleport(传送门)、Suspense(异步组件加载状态)。
4. 响应式原理
-
Vue2:
- 对象:
Object.defineProperty劫持属性。 - 数组:重写数组方法(如
push、pop)。 - 缺点:无法检测新增/删除属性,需用
$set。
- 对象:
-
Vue3:
- 使用
Proxy代理整个对象,支持动态属性。 - 使用
Reflect操作源对象。 - 优点:支持 Map/Set,性能更高。
- 使用
5. Composition API vs Options API
-
Composition API:
-
逻辑按功能组织,代码复用更灵活(如自定义 Hook)。
-
更好的 TypeScript 支持。
-
示例:
javascript
setup() { const count = ref(0); const double = computed(() => count.value * 2); return { count, double }; }
-
-
Options API:
- 传统方式(
data、methods分块)。 - 适合简单场景。
- 传统方式(
6. 常用 API
-
响应式数据:
ref:基本类型(通过.value访问)。reactive:对象类型。toRefs:解构响应式对象不丢失响应性。
-
生命周期:
setup替代beforeCreate/created。onMounted、onUpdated等。
-
工具函数:
watch/watchEffect:监听数据变化。provide/inject:跨组件通信。
7. 常见问题
-
v-if 和 v-for 优先级:
- Vue2:
v-for优先。 - Vue3:
v-if优先。
- Vue2:
-
动态组件:
vue
<component :is="currentComponent" /> -
状态管理:
- Vue3 推荐
Pinia(替代 Vuex),更简洁。
- Vue3 推荐
8. 代码优化
-
script setup语法糖:-
自动注册组件,无需
return。 -
示例:
vue
<script setup> import { ref } from 'vue'; const msg = ref('Hello!'); </script>
-
-
性能优化:
shallowRef/shallowReactive:浅层响应式。markRaw:跳过 Proxy 代理(如组件实例)。
9. 新组件
-
Teleport:将组件渲染到 DOM 任意位置。
vue
<Teleport to="body"> <Modal /> </Teleport> -
Suspense:处理异步组件加载状态。
vue
<Suspense> <template #default><AsyncComponent /></template> <template #fallback><Loading /></template> </Suspense>
总结
- Vue3 核心:Proxy 响应式、Composition API、性能优化。
- 升级理由:更好的开发体验(逻辑复用、TS 支持)、更优性能。
- 学习重点:掌握
ref/reactive、组合式函数、Pinia状态管理。