Vue原理高频面试题及详细答案(实战面试版)_第1页
Vue原理高频面试题及详细答案(实战面试版)_第2页
Vue原理高频面试题及详细答案(实战面试版)_第3页
Vue原理高频面试题及详细答案(实战面试版)_第4页
Vue原理高频面试题及详细答案(实战面试版)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Vue原理高频面试题及详细答案(实战面试版)一、基础核心原理1.说说你对Vue响应式原理的理解?Vue2和Vue3有什么区别?参考答案:Vue的响应式核心是数据劫持+依赖收集+派发更新,本质是监听数据变化,自动更新视图。Vue2响应式原理:基于Object.defineProperty()对对象的属性进行劫持。在数据初始化时,遍历data中的所有属性,为每个属性设置getter和setter。1.依赖收集:组件渲染的时候会触发数据的getter,此时会把当前渲染的Watcher收集到Dep依赖池中;2.派发更新:当数据发生修改时,会触发setter,Dep通知内部所有Watcher执行更新,重新渲染视图。Vue2存在的缺陷:1.无法监听对象新增、删除的属性,因为初始化没有劫持新属性,所以需要用Vue.set/this.$set;2.无法监听数组下标修改、数组长度修改,只能重写数组7个变异方法(push/pop/shift/unshift/splice/sort/reverse)实现监听;3.必须提前遍历所有属性,层级越深遍历开销越大,性能一般。Vue3响应式原理:基于ES6Proxy代理整个对象,解决了Vue2的所有缺陷。1.Proxy直接代理对象整体,无需遍历每个属性,支持动态新增、删除属性;2.可以监听数组下标、数组长度的修改,无需重写数组方法;3.配合Reflect操作属性,语义更清晰,返回值更可控;4.支持惰性劫持,访问哪层数据才劫持哪层,大幅提升初始化性能。补充:Vue3的ref是单独对基本数据类型做响应式(因为基本类型无对象可代理),通过劫持value属性实现响应式,reactive针对引用类型。2.什么是依赖收集?什么时候触发依赖收集?参考答案:依赖收集就是记录当前视图用到了哪些数据的过程。组件渲染时,会执行render函数生成虚拟DOM,这个过程会读取data中的数据,数据的getter会被触发。此时会把当前组件的渲染Watcher,添加到该数据对应的Dep依赖容器中。简单说:谁用了这个数据,谁就是依赖,就把谁收集起来。触发时机:组件首次渲染、组件更新重新渲染、计算属性执行、监听器执行时。3.什么是派发更新?更新流程是怎样的?参考答案:当响应式数据被修改时,会触发数据的setter,Dep会遍历内部收集的所有Watcher,通知Watcher执行更新操作,这个过程就是派发更新。完整流程:1.修改数据→触发setter;2.Dep收到更新通知,遍历所有关联Watcher;3.Watcher触发update方法;4.进入异步更新队列(避免多次修改多次渲染);5.队列清空后,执行render生成新虚拟DOM,diff对比更新真实DOM。二、虚拟DOM与Diff算法4.什么是虚拟DOM?为什么需要虚拟DOM?参考答案:虚拟DOM是对真实DOM的抽象描述,本质就是一个JS对象,用来记录节点的标签、属性、子节点等信息。真实DOM操作开销极大,频繁增删改查DOM会造成页面重排重绘,性能很差。而JS运算速度非常快,Vue通过虚拟DOM先在内存中对比新旧节点差异,只把需要修改的部分更新到真实DOM,最大限度减少DOM操作次数,提升页面性能。另外虚拟DOM实现了跨平台渲染,可以适配浏览器、小程序、移动端等不同平台。5.详细说说Vue2的Diff算法流程参考答案:Diff算法核心原则:同层比较,不跨层级对比,只对比新旧虚拟DOM的同一层级节点,提升对比效率。整体流程分为:头头对比、尾尾对比、头尾对比、尾头对比、未知节点遍历1.头头比较:新节点头部和旧节点头部对比,key相同则复用节点,指针后移;2.尾尾比较:新节点尾部和旧节点尾部对比,key相同则复用节点,指针前移;3.头尾比较:旧头新尾对比,匹配成功则将旧头部节点移动到旧尾部;4.尾头比较:旧尾新头对比,匹配成功则将旧尾部节点移动到旧头部;5.以上四种都不匹配时,在旧节点剩余未处理节点中查找新节点;6.查找成功:移动对应旧节点到当前位置;7.查找失败:说明是新节点,直接创建新DOM插入;8.最后对比新旧指针边界,多余旧节点直接删除,多余新节点批量新增。6.key的作用是什么?为什么不建议用index作为key?参考答案:key是节点的唯一标识,Diff算法通过key判断节点是否可以复用,精准定位新旧节点对应关系,减少不必要的DOM销毁和重建。不建议用index做key的原因:1.数组删除、插入、排序时,数组index会重新排序,导致原本可复用的节点key失效;2.Diff会误判节点变化,导致DOM频繁销毁重建,造成性能浪费;3.会引发组件状态错乱、表单数据错乱、选中状态丢失等问题。最佳实践:使用后端返回的唯一id作为key。7.Vue3的Diff算法相比Vue2做了哪些优化?参考答案:1.静态提升:编译阶段将不会变化的静态节点、静态属性提升到渲染函数外部,每次渲染直接复用,无需重新创建虚拟DOM;2.补丁标记:编译时给动态节点打上PatchFlags标记,比如文本变化、属性变化、子节点变化,Diff时只对比标记的动态内容,跳过静态节点;3.最长递增子序列:在节点乱序更新场景下,通过最长递增子序列找出无需移动的稳定节点,最大程度减少DOM移动次数,大幅提升列表更新性能;4.优化了边界判断逻辑,对比流程更精简。三、异步更新队列(nextTick)8.为什么Vue数据更新是异步的?参考答案:为了提升渲染性能。如果每次修改数据都立即更新视图,连续多次修改数据会触发多次DOM渲染,造成极大的性能浪费。Vue的策略是:数据同步修改,视图异步更新。当数据发生变化时,Vue不会立即更新视图,而是将更新Watcher推入异步队列,缓存同一轮事件循环中的所有数据变更。等到当前代码执行完毕,再统一执行队列中的所有更新,只做一次视图更新,避免重复渲染。9.说说nextTick的原理和使用场景参考答案:nextTick是Vue提供的异步方法,用于在DOM更新完成后执行回调。原理:利用浏览器的微任务、宏任务机制,将回调延迟到下一次事件循环执行。Vue会优先使用Promise.then、MutationObserver等微任务,降级使用setTimeout宏任务,保证回调在DOM更新完成后触发。使用场景:1.修改数据后,需要立即操作更新后的DOM;2.需要获取更新后的DOM宽高、位置、内容;3.刷新DOM后执行聚焦、滚动、动画等操作。四、组件渲染与更新机制10.Vue组件的渲染流程是什么?参考答案:1.模板编译:将template模板编译成AST抽象语法树,再转化为render渲染函数;2.生成虚拟DOM:执行render函数,生成虚拟DOM节点;3.Diff对比:新旧虚拟DOM进行层级对比,找出差异;4.生成真实DOM:根据差异补丁,生成或修改真实DOM;5.挂载页面:将真实DOM挂载到页面根节点,完成渲染。11.Vue组件更新的触发条件有哪些?参考答案:1.组件自身data、state响应式数据发生变化;2.父组件传递的props数据发生变化;3.组件触发$forceUpdate强制更新;4.依赖的provide/inject数据变化;5.监听的路由、全局状态变化触发组件更新。12.如何避免Vue不必要的组件更新?参考答案:1.使用computed计算属性缓存结果,依赖不变就不重新计算,避免重复渲染;2.合理使用v-once渲染静态内容,只渲染一次,后续不再更新;3.子组件设置props校验,避免无效数据传递引发更新;4.使用memo(Vue3)或自定义shouldComponentUpdate逻辑,阻断无用更新;5.拆分组件,细粒度拆分,保证最小更新范围;6.避免在模板中写复杂表达式、方法调用,减少渲染开销。五、计算属性与侦听器原理13.computed和watch的区别?底层原理差异?参考答案:computed计算属性:1.基于依赖缓存,依赖不变,多次访问只会执行一次;2.惰性执行,只有被读取时才会计算;3.适合数据派生、简单数据处理(拼接、筛选、计算);4.是同步执行,不支持异步。底层原理:内部有专属计算Watcher,依赖收集后会缓存结果,依赖变化才重新计算。watch侦听器:1.无缓存,数据每次变化都会触发执行;2.主动监听数据变化,主动触发回调;3.适合数据变化后的异步操作、复杂逻辑(请求接口、监听路由、复杂判断);4.支持异步操作。底层原理:内部是用户自定义Watcher,数据更新直接触发回调,无缓存机制。14.computed为什么有缓存?参考答案:computed的Watcher有dirty脏值标记。默认dirty为true,读取时会执行计算逻辑,更新缓存值,随后dirty置为false。后续再次读取时,只要依赖数据没变化,dirty始终为false,直接返回缓存值,不会重新执行函数。只有当依赖数据更新,触发依赖更新,dirty重置为true,下次读取才会重新计算。这个机制是computed高性能的核心。六、Vue3进阶原理15.Vue3的CompositionAPI相比OptionsAPI的原理优势参考答案:1.逻辑聚合:OptionsAPI按选项分类(data/methods/watch),业务逻辑分散;CompositionAPI按业务功能聚合,同一功能的变量、方法、监听写在一起,维护性更高;2.更好的复用:通过组合式函数抽离通用逻辑,无需依赖mixin,避免mixin命名冲突、来源不清晰的问题;3.类型友好:天然适配TS,类型推导更精准;4.按需引入:响应式API可按需导入,打包体积更小;5.无this约束:摆脱this指向问题,代码更简洁。16.ref和reactive的区别?参考答案:1.适配类型不同:ref支持基本类型+引用类型,reactive只支持对象、数组等引用类型;2.实现原理不同:ref通过劫持value属性实现响应式;reactive通过Proxy代理整个对象;3.使用方式不同:ref定义的数据,脚本中需要通过.value访问,模板中自动解构无需.value;reactive直接访问属性即可;4.响应式稳定性:reactive不支持整体替换对象,会丢失响应式;ref可以整体替换value,响应式不丢失;5.场景区分:简单基本类型用ref,复杂对象、表单对象、列表数据用reactive。17.Vue3响应式丢失的场景及解决方案参考答案:常见丢失场景:1.直接解构reactive对象,导致属性脱离响应式;2.整体重新赋值reactive对象;3.将reactive对象属性单独赋值给普通变量;4.函数传参解构reactive数据。解决方案:1.解构使用toRefs/toRef,保证解构属性保留响应式;2.避免整体替换reactive对象,修改数据只改属性;3.复杂数据优先用ref,支持整体替换;4.传递响应式数据时传递完整对象,不单独解构属性传递。七、高频原理追问(压轴面试题)18.说说Vue的渲染Watcher、计算Watcher、侦听Watcher的区别参考答案:1.渲染Watcher:每个组件对应一个,负责组件视图更新,优先级最低,数据更新后最后执行,负责渲染页面;2.计算Watcher:对应computed,惰性执行、有缓存、优先级最高,依赖变化才更新,不触发视图重渲染;3.侦听Watcher:对应watch,优先级居中,数据变化立即执行回调,无缓存,可处理异步逻辑。执行顺序:计算Watcher>侦听Watcher>渲染Watcher19.Vue为什么不能监听数组下标变化?Vue3为什么可以?参考答案:Vue2中数组是特殊处理的,没有对数组每一个下标做劫持,只重写了7个变异方法。如果通过下标修改数组,不会触发数组的setter,所以无法监听。如果对数组每一个下标劫持,超大数组会造成极大的性能开销,官方出于性能考量放弃了下标监听。Vue3使用Proxy代理整个数组对象,Proxy可以拦截数组的下标赋值、长度修改、删除等所有操作,无需遍历下标,性能更好,所以天然支持数组下标和长度的监听。20.简述Vue从初始化到页面渲染完成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论