文章目录
🌟 核心概念必考篇
1. Vue3响应式原理(面试必问!)
Vue3改用Proxy替代Object.defineProperty实现响应式,这个改动直接让性能提升40%+!举个🌰:
const reactiveObj = reactive({
name: 'Vue3',
version: 3.2
});
// 自动追踪依赖
effect(() => {
console.log(reactiveObj.version);
});
reactiveObj.version = 3.3; // 触发更新
核心要点:
- Proxy可以监听对象/数组的增删改查(Object.defineProperty做不到这点!)
- 嵌套对象自动代理(不用再递归遍历了)
- 用WeakMap做缓存提升性能
2. Composition API vs Options API
(面试官超爱对比题!)
// Options API
export default {
data() { return { count: 0 } },
methods: { increment() { this.count++ } }
}
// Composition API
import { ref } from 'vue';
export default {
setup() {
const count = ref(0);
const increment = () => count.value++;
return { count, increment };
}
}
差异对比表:
特性 | Options API | Composition API |
---|---|---|
逻辑复用 | Mixins | 自定义Hook函数 |
代码组织 | 按选项分类 | 按功能组织 |
TypeScript支持 | 一般 | 优秀 |
学习曲线 | 平缓 | 较陡 |
💡 新特性实战解析
3. Teleport组件(灵魂拷问场景题)
遇到模态框被父组件样式影响的情况怎么办?看这个案例:
<template>
<button @click="showModal">打开弹窗</button>
<Teleport to="body">
<div v-if="visible" class="modal">
<h2>我是全局弹窗!</h2>
</div>
</Teleport>
</template>
这样弹窗就会直接渲染到body下,完美避开CSS层级问题!
4. 性能优化黑科技
Vue3的编译时优化才是真香警告:
- 静态节点提升:把不变的节点提到render函数外
- PatchFlags:动态节点标记,diff时跳过静态比较
- Tree-shaking支持:没用到的API不会打包
🚀 高频实战题目
5. 自定义Hooks开发(手写代码题)
面试常让手写useMousePosition:
import { ref, onMounted, onUnmounted } from 'vue';
export function useMousePosition() {
const x = ref(0);
const y = ref(0);
const update = (e: MouseEvent) => {
x.value = e.pageX;
y.value = e.pageY;
};
onMounted(() => window.addEventListener('mousemove', update));
onUnmounted(() => window.removeEventListener('mousemove', update));
return { x, y };
}
使用示例:
<script setup>
const { x, y } = useMousePosition();
</script>
<template>
鼠标位置:{{x}}, {{y}}
</template>
6. 原理深挖题:响应式实现
手写简易版reactive:
function myReactive(obj) {
return new Proxy(obj, {
get(target, key) {
track(target, key); // 收集依赖
return Reflect.get(target, key);
},
set(target, key, value) {
Reflect.set(target, key, value);
trigger(target, key); // 触发更新
return true;
}
});
}
这个实现虽然简单,但已经包含了Vue3响应式的核心思想!
🔥 避坑指南
7. 常见陷阱题
<script setup>
const state = reactive({ count: 0 });
// ❌ 错误!解构会丢失响应式
const { count } = state;
// ✅ 正确姿势
const count = ref(0);
// 或者用toRefs
const { count } = toRefs(state);
</script>
8. 生命周期变化
Vue3的生命周期改名前缀加上"on":
- beforeCreate -> setup()
- created -> setup()
- beforeMount -> onBeforeMount
- mounted -> onMounted
- 新增的:onRenderTracked(调试用)
🛠️ 项目实战技巧
9. 最佳实践建议
- 组合式函数命名用use前缀
- 复杂组件用
<script setup>
语法 - 状态管理优先用Pinia
- 善用v-memo做性能优化
- CSS作用域用scoped或CSS Modules
10. 性能优化checklist
- 使用vite构建(比webpack快10倍!)
- 按需引入组件库
- 合理使用keep-alive
- 大数据量用虚拟滚动
- 避免v-if和v-for一起用
💼 面试加分项
掌握这些能惊艳面试官:
- 理解编译时优化原理
- 能说清Vue3的Tree-shaking实现
- 对比过Vue3和React Hooks的差异
- 实践过SSR+hydration
- 了解Vue3的TS类型系统设计
最后提醒:面试时一定要准备项目中的具体案例,比如:
“在我们电商项目中,用Composition API重构商品筛选模块,代码体积减少了30%,逻辑复用率提升了50%…”
(ps:看完这篇快去github上找个Vue3项目练手吧!)