原文链接: https://interview.poetries.top/docs/excellent-docs/7-Vue.html
Vue
简版速记
面试前快速过一遍的高频考点,每条都是「问到时能立刻说出口」的精炼版。
- MVVM:
Model-View-ViewModel,ViewModel通过双向绑定连接数据与视图;Vue 借鉴该思想但本质是 MVVM 的「响应式 + 数据驱动视图」。 - 响应式原理(Vue2):
Object.defineProperty劫持每个属性的getter/setter;getter 收集依赖(Dep 收集 Watcher),setter 派发更新(dep.notify())。缺陷:无法监听新增/删除属性(需Vue.set/Vue.delete)、数组索引和length改动;需递归遍历,深层对象有性能开销。 - 响应式原理(Vue3):
Proxy + Reflect惰性代理整个对象,天然支持新增/删除属性与数组索引,按需递归(访问时才代理嵌套对象),性能更好。 - 数组监听:Vue2 重写了 7 个变异方法(
push/pop/shift/unshift/splice/sort/reverse)的原型来触发更新;直接改索引/length 不生效。 - 依赖收集:每个响应式属性持有一个
Dep,渲染时Watcher读取触发 getter → 把当前 Watcher 收进 Dep;数据变化时 Dep 通知所有 Watcher 更新。 nextTick:DOM 更新是异步的,nextTick把回调放进微任务队列(优先Promise.then,降级MutationObserver/setImmediate/setTimeout),在本轮 DOM 更新后执行。computedvswatch:computed有缓存(依赖不变不重算)、用于派生值;watch无缓存、用于「数据变化执行副作用」(异步/开销大的操作)。- diff 算法:同层比较 + 双端比较(头头、尾尾、头尾、尾头)+
key复用节点;key必须唯一稳定,避免用 index 作 key。 - 生命周期:
beforeCreate → created(可访问 data,不可访问 DOM)→ beforeMount → mounted(可访问 DOM)→ beforeUpdate → updated → beforeDestroy/beforeUnmount → destroyed/unmounted;keep-alive额外有activated/deactivated。数据请求一般放created(SSR 友好)或mounted。 v-ifvsv-show:v-if真正增删 DOM、有更高切换开销、惰性;v-show只切display、初始渲染开销大、切换频繁用它。v-if与v-for:Vue2 中v-for优先级更高(同元素上会先循环再判断,浪费),Vue3 中v-if优先级更高;都应避免同元素混用,改用计算属性过滤。- 组件
data为函数:每个组件实例需独立数据副本,函数返回新对象避免实例间共享引用。 - 双向绑定
v-model:语法糖 =:value+@input(Vue2);Vue3 默认modelValue+update:modelValue,支持多个v-model与自定义参数。 - 组件通信:
props/$emit、$attrs/$listeners(Vue3 合并到$attrs)、provide/inject、ref、EventBus、Vuex/Pinia。 keep-alive:缓存组件实例(LRU,max/include/exclude),命中缓存触发activated/deactivated而非重新创建。- 状态管理:Vue2 用 Vuex(
state/getters/mutations/actions);Vue3 推荐 Pinia(去掉 mutation、原生 TS 友好、扁平 store、支持插件)。 - Vue3 核心升级:
Proxy响应式、Composition API(<script setup>)、更好的 TS 支持、Tree-shaking 体积更小、Fragment/Teleport/Suspense、编译期静态提升与 patchFlag 优化。 - 异步渲染原因:避免同一事件循环内对同一数据多次修改导致重复渲染,合并到 nextTick 批量更新提升性能。
目录
- 1 谈谈你对MVVM的理解
- 2 谈谈你对SPA单页面的理解
- 3 Vue2.x 响应式数据原理
- 4 Vue3.x 响应式数据原理
- 5 Vue中如何检测数组变化
- 6 Vue中如何进行依赖收集?
- 7 Vue实例挂载的过程中发生了什么
- 8 理解Vue运行机制全局概览
- 9 如何理解Vue中模板编译原理
- 10 Vue生命周期相关
- 11 Vue.mixin的使用场景和原理
- 12 Vue组件data为什么必须是个函数?
- 13 nextTick在哪里使用?原理是?
- 14 computed和watch相关
- 15 Vue.set的实现原理
- 16 Vue diff算法相关问题
- 17 Vue组件相关
- 18 为什么Vue采用异步渲染
- 19 v-if和v-show区别
- 20 v-if和v-for哪个优先级更高
- 21 Vue的事件绑定原理
- 22 Vue 是如何实现数据双向绑定的
- 23 v-model双向绑定原理
- 24 什么是作用域插槽
- 25 keep-alive原理
- 26 Vue路由相关
- 27 Vuex相关
- 28 对Vue SSR的理解
- 29 Vue 修饰符有哪些
- 30 说说 vue 内置指令
- 31 怎样理解 Vue 的单向数据流
- 32 写过自定义指令吗?原理是什么
- 33 Vue3相关(1/2)
- 33 Vue3相关(2/2)
- 34 Vue中v-html会导致哪些问题
- 35 说下$attrs和$listeners的使用场景
- 36 在Vue中使用插件的步骤
- 37 vue-cli 工程技术集合介绍
- 38 delete和Vue.delete删除数组的区别?
- 39 v-on可以监听多个方法吗?
- 40 v-once的使用场景有哪些
- 41 Vue Ref的作用
- 42 scoped样式穿透
- 43 Class 与 Style 如何动态绑定
- 44 Vue为什么没有类似于React中shouldComponentUpdate的生命周期
- 45 SPA、SSR的区别是什么
- 46 vue-loader是什么?它有什么作用?
- 47 说说你对slot的理解?slot使用场景有哪些
- 48 Vue.observable你有了解过吗?说说看
- 49 Vue中的过滤器了解吗?过滤器的应用场景有哪些?
- 50 Vue项目中有封装过axios吗?主要是封装哪方面的?
- 51 说下你的vue项目的目录结构,如果是大型项目你该怎么划分结构和划分组件呢
- 52 从0到1自己构架一个vue项目,说说有哪些步骤、哪些重要插件、目录结构你会怎么组织
- 53 vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做
- 54 Vue项目中你是如何解决跨域的呢
- 55 Vue项目本地开发完成后部署到服务器后报404是什么原因呢
- 56 实际工作中,你总结的vue最佳实践有哪些
- 57 vue 中使用了哪些设计模式
- 58 如果让你从零开始写一个vuex,说说你的思路
- 59 使用vue渲染大量数据时应该怎么优化?说下你的思路!
- 60 动态给vue的data添加一个新的属性时会发生什么?怎样解决?
- 61 你是怎么处理vue项目中的错误的?
- 62 SPA首屏加载速度慢的怎么解决
- 63 Vue中常见性能优化
- 64 Vue项目性能优化-详细
- 65 Vue与Angular以及React的区别?
- 66 Vue2高级用法
- 67 Vue面试考察的高频原理
- 68 Vue面试考点答题分析
