一、核心概念高频题
-
Vue3响应式原理与Vue2的区别
• Vue2:基于Object.defineProperty
监听对象属性,需手动处理数组方法重写• Vue3:采用
Proxy
代理实现全量响应式,支持动态新增属性和深层嵌套对象监听 -
Composition API vs Options API
• 核心区别:逻辑复用方式(函数式组合 vs 对象配置)、代码组织模式(关注点分离)• 场景:复杂组件逻辑复用选Composition API,简单组件可沿用Options API
-
v-for中key的作用与index的隐患
• 作用:辅助Diff算法高效复用DOM节点,避免不必要的渲染• 问题:列表动态增删时,index作为key可能导致元素错位或状态混乱
-
Vue生命周期钩子变化
• 重命名:beforeDestroy
→beforeUnmount
,destroyed
→unmounted
• 新增:
onServerPrefetch
(SSR场景)
二、进阶特性高频题
-
Teleport与Suspense组件应用
• Teleport:解决模态框/弹窗的DOM层级问题(如挂载到body)• Suspense:处理异步组件加载状态(fallback内容展示)
-
自定义指令实现场景
• 示例:v-lazy
(图片懒加载)、v-permission
(权限控制)• 钩子函数:
mounted
、updated
、unmounted
等 -
Vue3的ref与reactive选择策略
•ref
:基本类型(自动装箱为{ value: ... }
对象)•
reactive
:对象/数组(直接解构会丢失响应性,需用toRefs
) -
Pinia与Vuex对比
• 优势:无嵌套模块、Composition API友好、TypeScript原生支持• 核心概念:
state
、getters
、actions
(移除mutation)
三、性能优化高频题
-
首屏加载优化策略
• 路由懒加载:component: () => import('...')
• CDN加速第三方库、Tree-Shaking移除未使用代码
-
虚拟DOM与Diff算法优化
• 优化策略:同层比较、静态节点标记、最长递增子序列算法• Key的作用:精确识别节点身份,减少DOM操作
-
响应式数据深度监听问题
• 解决方案:watch
的deep: true
选项或watchEffect
自动追踪依赖 -
shallowRef/shallowReactive使用场景
• 适用场景:大型对象/列表仅需第一层响应式变化(如JSON配置数据)
四、实战与工程化高频题
-
TypeScript集成要点
• 类型声明:defineProps<{ title: string }>()
、defineEmits<(...)>()
• 类型推断:Composition API自动推导响应式变量类型
-
SSR实现与Nuxt.js原理
• 核心流程:服务端生成HTML → 客户端Hydration激活• Nuxt特性:约定式路由、自动API层封装
-
单元测试工具与策略
• 工具链:@vue/test-utils
+Jest
• 测试重点:组件渲染、事件触发、状态更新
五、开放性问题
-
Vue与React Hooks对比
• 响应式机制:自动依赖追踪 vs 手动声明依赖数组• 更新粒度:组件级更新 vs 函数级状态快照
-
项目性能瓶颈案例
• 典型场景:长列表卡顿(虚拟滚动方案)、内存泄漏(定时器/事件监听未清除) -
Vue生态未来趋势
• 构建工具:Vite全面替代Webpack• 状态管理:Pinia成为官方推荐,Vuex逐步淘汰
六、编码实操题
-
手写简易响应式系统
function reactive(obj) { return new Proxy(obj, { get(target, key) { /* 依赖收集 */ }, set(target, key, value) { /* 触发更新 */ } }) }
-
实现图片懒加载指令
const vLazy = { mounted(el, binding) { const observer = new IntersectionObserver((entries) => { if (entries[0].isIntersecting) { el.src = binding.value; observer.unobserve(el); } }); observer.observe(el); } }