Files
zhuangang/topics/frontend/vue/interview.md
T

4.2 KiB
Raw Blame History

id, title, type, domain, stack, tags, level, related, week
id title type domain stack tags level related week
frontend.vue.interview Vue 面试题 interview frontend
vue
Vue 3
响应式
Pinia
面试
intermediate
frontend.vue.reactivity-composition
7
16

Vue 面试题

基础

【基础】Vue 3 的响应式原理是什么?

参考答案:reactive 用 Proxy 拦截读写,读取时把当前运行的副作用(渲染函数、computed、watch)记录为依赖,写入时触发这些副作用重新执行;ref 通过 .value 的访问器实现。更新是异步批量的,同一轮修改只渲染一次。

追问:和 Vue 2 有什么区别?→ Vue 2 用 Object.defineProperty,需要初始化时递归转换,无法检测新增属性和数组索引修改;Proxy 可以拦截这些操作,并且是惰性代理。

【基础】ref 和 reactive 有什么区别?

参考答案:ref 可以包装任何值,通过 .value 访问,模板中自动解包,可以整体替换;reactive 只能用于对象,直接访问属性,解构会丢失响应性,整体替换会断开引用。很多团队统一用 ref。

追问:解构 Pinia store 怎么保持响应性?→ 用 storeToRefs(store) 解构状态和 getter,方法直接从 store 解构。

【基础】computed 和 watch 的区别?

参考答案:computed 用于派生值,有缓存,依赖不变不重新计算,不应有副作用;watch 用于响应变化执行副作用(请求、写存储),可以拿到新旧值、控制立即执行和深度监听。

追问:watch 和 watchEffect 的区别?→ watch 显式指定数据源、惰性执行;watchEffect 自动收集依赖、立即执行一次。

进阶

【进阶】组合式函数和 React Hooks 有什么区别?

参考答案:Vue 的 setup 只执行一次,响应式系统自动追踪依赖,没有依赖数组和闭包陈旧值问题,也没有“Hooks 必须按顺序调用”的限制;React 组件每次渲染都执行函数体,靠依赖数组和 memo 控制。Vue 组合式函数要注意返回值保持响应性和副作用清理。

追问:组合式函数里怎么清理副作用?→ onScopeDispose 或 onUnmounted 中取消请求、清除定时器;watch 的清理回调处理竞态。

【进阶】nextTick 的作用和原理?

参考答案:Vue 把 DOM 更新放进异步队列批量执行,nextTick 返回一个在下一次 DOM 更新完成后 resolve 的 Promise(基于微任务),用于在修改数据后读取更新后的 DOM。

追问:为什么要批量异步更新?→ 避免同一轮中多次修改导致多次渲染,提高性能。

【进阶】Vue 应用有哪些性能优化手段?

参考答案:路由和组件懒加载;长列表虚拟滚动;shallowRef / markRaw 减少深度代理;v-memo、v-once;computed 缓存;避免不必要的组件重渲染(稳定的 props);按需引入组件库;图片懒加载和压缩;构建层面的拆包。

追问:怎么定位是哪个组件渲染慢?→ Vue DevTools 的性能面板、浏览器 Performance 面板录制,查看组件渲染耗时和次数。

场景题

【场景题】做一个 AI 对话界面,流式输出要注意什么?

参考答案:fetch + 增量 SSE 解析(POST、鉴权头);状态机;停止生成和卸载时取消;断线带 Last-Event-ID 续传;结构化的 final 事件返回引用;渲染节流和 XSS 清洗;网关关闭缓冲。详见AI 对话界面场景。

追问:为什么不用 EventSource?→ 只支持 GET、不能自定义请求头,问题内容和令牌不适合放在 URL 中。

【场景题】一个后台表格页面有 1 万行数据,滚动很卡,怎么优化?

参考答案:虚拟滚动只渲染可见行;数据用 shallowRef 存放;行组件保持 props 稳定、减少响应式开销;能分页就分页(服务端分页);复杂单元格延迟渲染;排序筛选放到 Web Worker 或服务端。

追问:虚拟滚动的原理?→ 根据滚动位置和行高计算可见范围,只渲染这一段,用占位高度撑开滚动条;行高不固定时需要测量和缓存高度。