前端面试知识库
基础原理

Vue

渐进式框架的核心机制与生态。核心能力:响应式原理、组件化、生命周期、路由、状态管理。

Vue 面试常考两件事:1) 机制原理(响应式、虚拟 DOM、编译优化);2) 实战踩坑(为什么 data 是函数、nextTick 为什么不能同步读 DOM)。把原理 + 场景一起说才有说服力。

组件与插件

维度组件 (Component)插件 (Plugin)
作用构建 UI 片段扩展 Vue 全局功能
目标App.vueVue 本身
注册局部 / 全局app.use(plugin)
编写形式.vue 文件暴露 install 方法

插件 install 核心对照

功能Vue 2 写法Vue 3 写法
全局属性/方法Vue.prototype.$xxxapp.config.globalProperties.$xxx
全局组件Vue.component()app.component()
全局指令Vue.directive()app.directive()
provide/inject手动实现app.provide() 原生支持

Vue 3 插件注册必须在 app.mount() 之前,否则不生效。

生命周期

Vue 2

钩子可访问 data可操作 DOM适用场景
created数据请求、初始化
mountedDOM 操作、第三方库初始化
updated操作更新后的 DOM
beforeDestroy清理定时器、移除监听(最重要)

Vue 3

Options APIComposition API适用场景
beforeMountonBeforeMount最后的数据修改
mountedonMountedDOM 操作、第三方库初始化
beforeUnmountonBeforeUnmount清理资源(最重要)
unmountedonUnmounted清理完成的通知

keep-alive 缓存组件

  • 首次进入:created → mounted → activated
  • 再次进入:activated(不经过 created/mounted)
  • 失活:deactivated(不经过 destroy)

data 为什么是函数

  • 根实例:data 可以是对象(单例,不复用)
  • 组件:data 必须是函数(防止多个实例共享同一引用)

组件复用时,如果 data 是对象,所有实例引用同一份数据 → 数据污染。函数每次返回新对象,保证独立性。

响应式原理

Vue 2:Object.defineProperty

  • 初始化时遍历 data 的每个属性,添加 getter/setter
  • 无法监听新增属性 → 需要 Vue.set()
  • 无法监听 delete → 需要 Vue.delete()
  • 数组需重写 push/pop/splice 等方法

Vue 3:Proxy

  • 代理整个对象,拦截所有操作
  • 自动监听新增属性和删除操作
  • 惰性代理:访问到哪层才代理哪层
  • 原生支持数组索引和 length 变化

Vue 3 响应式流程

数据读取 (get)

track(target, key) — 收集 effect 到依赖 Map

数据修改 (set)

trigger(target, key) — 找到并执行依赖中的 effect

组件重新渲染 / computed 重新计算 / watch 回调

ref vs reactive

特性refreactive
适用类型基础 + 引用仅对象
访问方式.value直接访问属性
替换整体值支持不支持(丢失代理)
解构安全丢失响应式

Vue 3.2+ 官方推荐优先使用 ref:统一 .value 语法,无解构丢失问题,适合整体替换。

v-show vs v-if

维度v-ifv-show
控制添加/删除 DOMdisplay: none
初始渲染条件为真才渲染总是渲染
切换开销高(重建 DOM)低(切换样式)
适用场景条件很少变化频繁切换
生命周期触发不触发

v-if 与 v-for 优先级

版本优先级说明
Vue 2v-for > v-if先遍历再判断
Vue 3v-if > v-for先判断再遍历

不要在同一元素上使用 v-ifv-for。用 computed 过滤列表或将 v-if 移到外层。

nextTick

Vue 的响应式更新是异步批处理的——数据变化后不会立即更新 DOM。

msg.value = 'Vue3 NextTick!'
console.log(box.value?.textContent) // 可能是旧值

nextTick(() => {
  console.log(box.value?.textContent) // 确保拿到新值
})

使用场景

  • 修改数据后读取更新后的 DOM
  • v-if 创建元素后初始化第三方库
  • 动态显示输入框后设置焦点

组件间通信

方式Vue 2Vue 3核心差异
父 → 子propsdefinePropsTS 类型推导更强
子 → 父$emitdefineEmits需提前声明
双向绑定v-model + .syncv-model(多个)更统一
事件总线EventBusmittVue3 移除实例事件方法
跨级状态VuexPinia更轻量,TS 原生
跨级注入provide/injectref/reactive 响应式自动响应式
获取子实例$refsref + defineExpose需显式暴露

Vue Router

hash vs history 模式

维度hash 模式history 模式
URL 样式http://xxx/#/pathhttp://xxx/path
原理hashchange 事件pushState/replaceState
服务器配置无需需配置(否则刷新 404)
SEO不利友好

导航守卫

类型守卫
全局beforeEach / beforeResolve / afterEach
路由独享beforeEnter
组件内beforeRouteEnter / beforeRouteUpdate / beforeRouteLeave

Vuex vs Pinia

特性VuexPinia
Mutation必须有,同步修改已移除,Action 统一处理
模块化嵌套 modules平铺独立 store
TS 支持较弱原生支持
动态注册需手动默认动态

Pinia 核心

  • State:状态数据
  • Getter:派生状态
  • Action:同步 + 异步操作(不再区分 mutation)

SPA 首屏优化

优化方向方案
减小入口体积路由懒加载
静态资源缓存HTTP 缓存 + Service Worker
UI 框架按需Tree Shaking / 自动导入
图片优化WebP / 懒加载 / 响应式图片
GZip 压缩Nginx / CDN 开启
SSR服务端渲染首屏

Vue 设计模式

模式Vue 应用重要程度
观察者模式响应式系统、watch、computed核心
代理模式Proxy 响应式、ref核心
组合模式组件树、插槽核心
工厂模式createApph 函数重要
策略模式v-if/v-show、过渡动画重要
发布订阅事件总线、mitt重要
单例模式Router、Store一般

本页内容