Vue3 面试常见八股文 200 题速记版
一、基础认知(1-15)
1. 什么是 Vue3?
- Vue3 是新一代渐进式前端框架。
- 核心升级是响应式系统、组合式 API、性能和 TS 支持。
2. Vue3 相比 Vue2 最大变化是什么?
- 响应式从 defineProperty 改成 Proxy
- 新增 Composition API
- 更好支持 TS
- 编译优化更强
3. Vue3 的核心优势是什么?
- 性能更好
- 逻辑复用更强
- 类型支持更友好
- Tree Shaking 更彻底
4. Vue3 还是 MVVM 吗?
- 是。
- 依然是数据驱动视图,本质思想没变。
5. Vue3 为什么更适合大型项目?
- Composition API 更利于逻辑拆分
- TS 支持更好
- 可维护性更高
6. 什么是渐进式框架?
- 可以按需接入能力,不强制一开始全用。
7. Vue3 适合哪些项目?
- 中后台
- 管理系统
- 组件库
- 中大型 SPA
- 新项目优先
8. Vue3 和 Vue2 能共存吗?
- 可以在不同项目中共存。
- 同一项目迁移通常需要逐步改造。
9. Vue3 为什么性能更好?
- 响应式更高效
- 编译优化更多
- diff 更精细
- 运行时体积更小
10. Vue3 的生态有哪些?
- Vue Router
- Pinia
- Vite
- Vue Devtools
11. Vue3 默认推荐什么状态管理?
- Pinia。
- 更轻、更直观、TS 更友好。
12. Vue3 默认推荐什么构建工具?
- Vite。
- 启动快,热更新快。
13. Vue3 和 React 区别?
- Vue 偏模板
- React 偏 JSX
- Vue 提供更完整官方方案
14. Vue3 为什么更适合 TS?
- API 设计更利于类型推导。
- 组合式写法也更适合抽类型。
15. Vue3 的学习主线是什么?
- 响应式
- setup
- ref/reactive
- 生命周期
- 组件通信
- 路由
- Pinia
二、响应式原理(16-35)
16. Vue3 响应式原理是什么?
- 基于 Proxy 劫持对象。
- 通过 track 收集依赖,trigger 触发更新。
17. Vue3 为什么用 Proxy?
- 能拦截更多操作
- 能直接监听新增/删除属性
- 对数组支持更自然
18. Proxy 比 defineProperty 好在哪?
- 不用递归一上来遍历全部属性
- 可监听新增、删除、数组下标等变化
19. Vue3 的依赖收集是怎么做的?
- 读取数据时 track
- 修改数据时 trigger
- 副作用函数重新执行
20. 什么是 effect?
- 响应式副作用函数。
- 依赖变化后会重新执行。
21. 什么是 track?
- 依赖收集。
- 谁读取了响应式数据,就记录谁。
22. 什么是 trigger?
- 派发更新。
- 数据变化后通知依赖重新执行。
23. Vue3 能监听对象新增属性吗?
- 能。
- 因为 Proxy 可以拦截 set。
24. Vue3 能监听数组下标变化吗?
- 能。
- 这是相对 Vue2 的明显改进。
25. Vue3 响应式一定是深层的吗?
- reactive 默认是深层响应式。
- 但也有 shallowReactive 这种浅层版本。
26. shallowReactive 是什么?
- 只代理第一层。
- 深层对象不继续做响应式。
27. shallowRef 是什么?
- 只跟踪 .value 本身变化。
- 不深度代理内部对象。
28. readonly 是什么?
- 创建只读响应式对象。
- 不能直接修改。
29. shallowReadonly 是什么?
- 第一层只读。
- 深层对象不做深只读处理。
30. markRaw 是什么?
- 标记对象永远不要转成响应式。
- 常用于第三方实例、性能敏感对象。
31. toRaw 是什么?
- 获取响应式对象对应的原始对象。
32. reactive 和普通对象区别?
- reactive 返回的是代理对象,不是原对象本身。
33. 为什么 Vue3 响应式更适合大对象?
- 不需要像 Vue2 那样初始化时深度遍历所有属性做劫持。
34. 响应式丢失常见原因有哪些?
- 解构 reactive
- 直接赋值覆盖响应式对象
- 脱离代理访问
35. 怎么避免响应式丢失?
- 优先用 ref
- 解构时配合 toRefs/toRef
- 不直接替换整个 reactive 对象引用
三、Composition API(36-70)
36. 什么是 Composition API?
- 组合式 API。
- 按功能组织代码,而不是按 options 分类。
37. Composition API 为什么更强?
- 逻辑更集中
- 复用更方便
- 大组件更好维护
38. setup 是什么?
- Composition API 的入口函数。
- 组件创建时最早执行。
39. setup 里能拿到 this 吗?
- 不能。
- setup 中 this 是 undefined。
40. setup 执行时机是什么?
- 在 beforeCreate 前后这个初始化阶段。
- 比 data、methods 更早。
41. setup 返回值有什么用?
- 返回给模板使用。
- 也可以返回给 render 函数使用。
42. 为什么 setup 不要写太大?
- 会导致逻辑堆积。
- 应拆成 composable。
43. 什么是 composable?
- 可复用的组合式逻辑函数。
- 一般以 useXxx 命名。
44. composable 和 mixin 区别?
- composable 来源清晰
- 不容易命名冲突
- 逻辑复用更显式
45. Vue3 为什么弱化 mixin?
- mixin 来源不清楚,冲突难排查。
- composable 更好维护。
46. script setup 是什么?
- setup 语法糖。
- 写法更简洁,模板可直接用顶层变量。
47. script setup 有什么优点?
- 代码少
- 可读性好
- 编译优化更好
48. defineProps 是什么?
- script setup 中定义 props 的宏。
49. defineEmits 是什么?
- script setup 中定义 emits 的宏。
50. defineExpose 是什么?
- 显式暴露子组件内容给父组件 ref 访问。
51. defineOptions 是什么?
- 在 script setup 中声明组件选项。
52. defineSlots 是什么?
- 声明插槽类型信息,常用于 TS。
53. useAttrs 是什么?
- 获取透传 attrs。
54. useSlots 是什么?
- 获取当前组件 slots。
55. getCurrentInstance 有什么用?
- 获取当前组件实例。
- 一般只在少数底层封装场景用。
56. onMounted 在 setup 里怎么用?
- 直接调用生命周期函数注册。
57. setup 能写异步吗?
- 可以,但常结合 Suspense 或异步组件场景。
58. 为什么 Composition API 更适合逻辑拆分?
- 同一功能的数据、方法、监听能放一起。
59. setup 和 data 谁先执行?
- setup 更早。
60. setup 和 methods 能一起用吗?
- 能。
- Options API 和 Composition API 可以共存。
61. setup 里怎么访问 props?
- setup(props) 第一个参数就是 props。
62. setup 里怎么触发 emit?
- setup(props, { emit }) 中通过 emit 触发。
63. setup 第二个参数有哪些?
- attrs
- slots
- emit
- expose
64. 为什么说 script setup 更适合业务组件?
- 模板和逻辑更紧凑,样板代码更少。
65. 什么时候仍然会用 Options API?
- 老项目维护
- 小组件
- 团队习惯
66. setup 返回 reactive 和 ref 给模板时要 .value 吗?
- 模板中通常自动解包 ref,不用手写 .value。
67. JS 中访问 ref 要不要 .value?
- 要。
- 除非经过模板自动解包或特定语法处理。
68. setup 为什么适合封装公共逻辑?
- 不依赖 this,逻辑可直接抽函数复用。
69. composable 命名为什么常用 use 开头?
- 社区约定俗成,看到就知道是复用逻辑。
70. Composition API 的核心心智是什么?
- 按功能聚合代码,而不是按配置项分散代码。
四、ref / reactive(71-95)
71. ref 是什么?
- 用于包装基本类型,也可包装对象。
- 通过 .value 取值。
72. reactive 是什么?
- 用于创建对象或数组的响应式代理。
73. ref 和 reactive 区别?
- ref 更通用
- reactive 更适合对象
- ref 有 .value
74. 为什么推荐优先用 ref?
- 一致性更强
- 替换整体值更方便
- TS 推导也常更稳
75. reactive 能直接接收基本类型吗?
- 不能。
- 只适合对象类型。
76. ref 包装对象时底层是什么?
- 内部也会把对象转成 reactive 风格的响应式。
77. toRef 是什么?
- 把对象某个属性转成 ref。
78. toRefs 是什么?
- 把对象每个属性都转成 ref。
- 常用于解构后仍保持响应式。
79. unref 是什么?
- 如果是 ref 就返回 .value,否则原样返回。
80. isRef 有什么用?
- 判断一个值是不是 ref。
81. isReactive 有什么用?
- 判断一个对象是不是 reactive 创建的。
82. isReadonly 有什么用?
- 判断对象是不是只读代理。
83. isProxy 有什么用?
- 判断对象是不是由响应式代理创建。
84. 为什么 reactive 解构后会丢响应式?
- 解构拿到的是普通值,不再经过代理访问。
85. ref 在模板中为什么不用 .value?
- 模板会自动解包。
86. reactive 为什么不能整体替换?
- 直接替换变量引用会丢失原来的代理关联。
87. ref 为什么适合整体替换值?
- 改的是 .value,本身引用关系不变。
88. toRefs 常见使用场景?
- setup 中返回 reactive 的各个字段给模板或外部使用。
89. 为什么很多团队不用 reactive 管整个表单?
- 大对象解构和替换时更容易出坑。
90. shallowRef 常用场景?
- 大对象
- 第三方实例
- 只关心整体替换,不关心深层变化
91. customRef 是什么?
- 自定义 ref 的依赖追踪和触发逻辑。
92. customRef 常见场景?
- 防抖输入框
- 自定义触发时机
93. triggerRef 是什么?
- 手动触发 shallowRef 更新。
94. ref 嵌套 ref 会怎样?
- 一般不推荐,容易增加理解成本。
95. ref/reactive 怎么选?
- 简单记:基本类型用 ref,对象通常 ref 或 reactive 都行,但团队统一更重要。
五、计算属性与侦听(96-115)
96. computed 是什么?
- 计算属性。
- 基于依赖派生新值。
97. computed 为什么有缓存?
- 依赖不变就复用上次结果。
98. computed 和 methods 区别?
- computed 有缓存
- methods 每次执行都会重新算
99. computed 和 watch 区别?
- computed 产出值
- watch 监听变化做副作用
100. watch 是什么?
- 监听数据变化执行回调。
101. watch 能监听哪些源?
- ref
- reactive 对象
- getter 函数
- 多个源数组
102. watch 默认是深度监听吗?
- 不是。
- 但直接监听 reactive 对象时会递归追踪。
103. watch 的 immediate 有什么用?
- 立即执行一次回调。
104. watch 的 deep 有什么用?
- 深度监听对象内部变化。
105. watchEffect 是什么?
- 自动收集依赖的副作用监听。
106. watch 和 watchEffect 区别?
- watch 依赖明确
- watchEffect 自动收集依赖
107. watchEffect 什么时候用?
- 依赖很多且不想手动一个个声明时。
108. watch 为什么更适合精确控制?
- 可以拿到新值旧值,可控制 immediate、deep、flush。
109. flush 有什么用?
- 控制 watch 回调执行时机。
110. flush 常见值有哪些?
- pre
- post
- sync
111. watch 什么时候停止?
- 组件卸载时自动停止。
- 手动创建也可手动 stop。
112. computed 能写 setter 吗?
- 能。
- 可写成 get/set 形式。
113. 为什么 computed 不适合异步?
- 它更适合返回同步计算结果。
114. 侦听路由变化怎么做?
- watch route
- 或用路由守卫
115. onWatcherCleanup 是做什么的?
- 侦听副作用清理。
- 常用于取消请求、清除上次副作用。
六、生命周期(116-130)
116. Vue3 生命周期有哪些?
- onBeforeMount
- onMounted
- onBeforeUpdate
- onUpdated
- onBeforeUnmount
- onUnmounted
- 还有 onActivated、onDeactivated 等
117. Vue3 生命周期和 Vue2 对应关系?
- beforeDestroy -> beforeUnmount
- destroyed -> unmounted
118. onMounted 什么时候用?
- DOM 挂载完成后。
- 常用于请求、DOM 操作、第三方库初始化。
119. onUpdated 什么时候用?
- 组件更新完成后。
- 但不要在里面乱改响应式数据。
120. onUnmounted 什么时候用?
- 组件卸载完成后。
- 常用于清理资源。
121. onBeforeUnmount 和 onUnmounted 区别?
- 一个是卸载前
- 一个是卸载后
122. keep-alive 相关生命周期有哪些?
- onActivated
- onDeactivated
123. onErrorCaptured 是什么?
- 捕获后代组件错误。
124. onRenderTracked 是什么?
- 调试渲染时依赖收集。
125. onRenderTriggered 是什么?
- 调试什么依赖触发了重新渲染。
126. onServerPrefetch 是什么?
- SSR 场景服务端预取数据。
127. setup 和 onMounted 的顺序?
- setup 先执行,再到 mounted 阶段。
128. 生命周期钩子一定要同步注册吗?
- 是。
- 要在 setup 同步阶段注册。
129. 为什么不能在异步回调里随便注册生命周期?
- 因为那时当前组件实例上下文可能已经丢了。
130. 生命周期的使用原则是什么?
- 创建期做初始化
- 挂载期做 DOM/请求
- 卸载期做清理
七、组件通信(131-145)
131. Vue3 组件通信方式有哪些?
- props
- emit
- v-model
- ref + defineExpose
- provide/inject
- Pinia
132. 父传子怎么做?
- props。
133. 子传父怎么做?
- emit。
134. 为什么 props 不能直接改?
- 单向数据流。
- 子组件直接改会破坏数据来源。
135. Vue3 的 v-model 和 Vue2 有什么区别?
- Vue3 默认是 modelValue + update:modelValue。
136. 多个 v-model 怎么做?
- 用 v-model:xxx 语法。
137. defineEmits 有什么好处?
- 事件定义更明确。
- TS 下类型更清晰。
138. 父组件怎么调用子组件方法?
- ref + defineExpose。
139. provide/inject 常见场景?
- 跨层级传值
- 组件库封装
- 祖孙通信
140. provide/inject 是响应式的吗?
- 传 ref/reactive 时可保持响应式。
- 传普通值则不是自动响应式。
141. emits 选项有什么用?
- 声明组件允许触发哪些事件。
142. attrs 和 props 区别?
- props 是显式声明的输入
- attrs 是未声明的透传属性
143. 什么是透传 attrs?
- 父组件传进来但子组件没声明成 props 的属性。
144. inheritAttrs 有什么用?
- 控制 attrs 是否自动挂到根节点。
145. 为什么 Vue3 通信更规范?
- script setup、defineProps、defineEmits 让组件接口更清晰。
八、模板、指令与渲染(146-165)
146. Vue3 模板语法和 Vue2 差很多吗?
- 不大。
- 大部分基础指令一致。
147. v-if 和 v-show 区别?
- v-if 控制渲染
- v-show 控制 display
148. v-for 为什么一定要 key?
- 帮助 diff 正确识别节点身份。
149. key 为什么别用 index?
- 容易导致错误复用。
150. Vue3 的 template ref 怎么用?
- DOM 或组件上写 ref,setup 中通过同名 ref 获取。
151. 什么是 Fragment?
- 组件可以有多个根节点,不必强制单根。
152. 什么是 Teleport?
- 把组件内容渲染到指定 DOM 节点。
- 常用于弹窗。
153. 什么是 Suspense?
- 处理异步依赖加载中的占位渲染。
154. Teleport 常见场景?
- Modal
- Drawer
- 全局浮层
155. Suspense 常见场景?
- 异步组件加载
- setup 异步依赖等待
156. slot 在 Vue3 有什么变化?
- 统一成函数式插槽。
157. 为什么函数式插槽更好?
- 依赖收集更准确。
- 性能更可控。
158. 动态组件怎么写?
- component + is。
159. keep-alive 有什么用?
- 缓存组件实例,避免重复创建。
160. Transition 是什么?
- 过渡动画组件。
161. TransitionGroup 是什么?
- 列表过渡动画组件。
162. 自定义指令在 Vue3 生命周期名字有什么变化?
- 更贴近组件生命周期,如 mounted、updated、unmounted。
163. v-model 修饰符在组件上怎么处理?
- 通过 modelModifiers 等方式接收修饰信息。
164. 模板中 ref 自动解包规则是什么?
- 顶层 ref 在模板中通常自动解包。
165. 渲染函数在 Vue3 里还重要吗?
- 重要。
- 底层封装、组件库、复杂渲染场景仍常用。
九、组件化与复用(166-180)
166. 什么是组件化?
- 把页面拆成独立可复用模块。
167. Vue3 逻辑复用为什么更好?
- 因为 composable 比 mixin 更清晰。
168. composable 常见场景有哪些?
- 请求封装
- 表单逻辑
- 滚动监听
- 权限逻辑
169. 什么是高阶组件思路?
- 通过包装组件增强能力。
- Vue 中不如 composable 常见。
170. 什么是插槽复用?
- 组件提供结构,父组件提供内容。
171. 什么是受控组件思路?
- 数据由父组件控制,子组件只负责展示和触发事件。
172. defineExpose 为什么重要?
- script setup 默认不自动暴露全部内容。
173. 组件库开发为什么喜欢 Vue3?
- 逻辑复用强、TS 好、编译能力强。
174. Vue3 异步组件怎么写?
- defineAsyncComponent。
175. defineAsyncComponent 有什么用?
- 按需加载组件,优化首屏。
176. keep-alive 的 include/exclude 有什么用?
- 控制哪些组件缓存、哪些不缓存。
177. 组件命名为什么重要?
- 影响调试、缓存匹配、团队协作。
178. 什么是递归组件?
- 组件在内部调用自己。
- 常用于树结构。
179. 递归组件要注意什么?
- 必须有终止条件。
- 否则会无限递归。
180. Vue3 组件设计核心是什么?
- 接口清晰
- 输入输出明确
- 低耦合
十、路由(181-190)
181. Vue Router 4 常和 Vue3 搭配吗?
- 是。
- Vue3 通常配 Vue Router 4。
182. createRouter 是什么?
- 创建路由实例。
183. createWebHistory 和 createWebHashHistory 区别?
- 一个是 history 模式
- 一个是 hash 模式
184. Vue3 路由懒加载怎么做?
- 路由组件写动态 import。
185. 路由守卫有哪些?
- 全局守卫
- 路由独享守卫
- 组件内守卫
186. useRoute 是什么?
- 在 setup 中获取当前路由信息。
187. useRouter 是什么?
- 在 setup 中获取路由实例。
188. setup 中怎么监听路由变化?
- watch(useRoute()) 或 watch 某个 route 字段。
189. beforeRouteLeave 常见场景?
- 离开确认
- 未保存表单提示
190. 路由 meta 常用来做什么?
- 权限
- 标题
- 缓存标记
十一、Pinia(191-200)
191. Pinia 是什么?
- Vue3 官方推荐状态管理库。
192. Pinia 相比 Vuex 好在哪?
- API 更简单
- TS 更友好
- 没有 mutations
193. defineStore 是什么?
- 定义 store 的函数。
194. Pinia 的核心概念有哪些?
- state
- getters
- actions
195. Pinia 为什么没有 mutations?
- 直接修改 state 或在 actions 中处理即可。
196. Pinia 支持模块化吗?
- 支持。
- 一个 store 就是一个天然模块。
197. Pinia 怎么做持久化?
- 配合本地存储或插件。
198. setup store 和 option store 区别?
- 一个写法更像 setup
- 一个更像传统选项式
199. storeToRefs 有什么用?
- 把 store 状态转成 ref,避免解构丢响应式。
200. Vue3 状态管理面试主线是什么?
- 为什么推荐 Pinia
- Pinia 和 Vuex 区别
- state/getters/actions
- 持久化和模块化
高频补充
- 核心主线:Proxy -> ref/reactive -> setup -> 生命周期 -> 通信 -> 路由 -> Pinia
- 高频对比:ref/reactive、watch/watchEffect、Vue2/Vue3、Pinia/Vuex
- 高频场景:Teleport、Suspense、defineExpose、storeToRefs、shallowRef