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

下载本文档

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

文档简介

Vue高频面试题及详细答案(实战向)一、Vue基础核心面试题1、说说你对Vue的理解,它和jQuery有什么区别?参考答案:Vue是一套渐进式的前端MVVM框架,核心是数据驱动视图、组件化开发,主打轻量、灵活、易上手,既可以开发小型页面,也能搭配生态搭建大型单页应用。和jQuery的核心区别主要有三点:1、开发思想不同:jQuery是直接操作DOM,需要手动获取节点、修改样式、更新内容,逻辑和DOM强绑定;Vue是数据驱动,只需要修改数据,视图会自动更新,几乎不用手动操作DOM。2、编程模式不同:jQuery是命令式编程,一步步告诉浏览器要做什么;Vue是声明式编程,只需要定义目标状态,框架自动完成后续操作。3、工程化能力不同:jQuery没有组件化、路由、状态管理等能力,复杂项目代码冗余、复用性差;Vue支持组件化、模块化,搭配vue-router、vuex/pinia、脚手架可以快速搭建规范化工程,适合中大型项目。2、Vue的MVVM原理是什么?M、V、VM分别指什么?参考答案:MVVM是Vue的核心设计模式,核心是实现数据和视图的双向绑定,彻底解耦数据层和视图层。M:Model(数据层),就是项目中的变量、接口返回数据、状态数据等业务数据。V:View(视图层),就是页面DOM结构、模板内容,用户看到的页面界面。VM:ViewModel(视图模型层),是M和V的中间桥梁,也是Vue实例的核心。它负责监听数据变化、劫持数据,同时监听视图的用户操作,实现数据更新视图、视图修改同步数据的双向联动。简单来说:数据变了视图自动更,视图输入修改数据,数据自动同步更新。3、v-if和v-for为什么不能连用?优先级问题是什么?参考答案:首先明确优先级:Vue2中v-for优先级高于v-if,Vue3中v-if优先级高于v-for。两者连用是项目中的禁忌,核心问题是性能浪费:1、Vue2场景:先循环渲染所有列表项,再通过v-if判断是否显示,哪怕只需要展示1条数据,也会完整循环遍历全部数据,造成无效循环、浪费性能。2、Vue3场景:先执行v-if判断,条件不成立时直接不循环,看似没问题,但如果条件依赖循环项的属性,会直接报错,因为还没循环、无法获取项属性。正确优化方案:要么在computed中提前过滤数据,把符合条件的数据筛选出来再循环;要么外层用template包裹v-if,内层写v-for,避免同级连用。4、Vue的key的作用是什么?为什么不能用index作为key?参考答案:key是Vue虚拟DOM的唯一标识,核心作用是提升diff算法的更新效率,精准识别新旧节点,避免不必要的DOM更新,同时保证列表节点的唯一性。不推荐用index作为key的原因:1、列表进行删除、插入、排序操作时,数组index会重新排序,导致新旧节点key错乱,diff算法无法精准匹配,会触发大量不必要的DOM更新,性能变差。2、会出现数据渲染错乱问题,比如列表带复选框、输入框时,删除中间项后,后续项的index变更,会导致页面数据和绑定状态不匹配。最佳实践:使用后端返回的唯一id、唯一标识作为key。5、Vue常用的指令有哪些?分别说说使用场景参考答案:1、v-text:渲染文本内容,会覆盖标签原有文本,适合纯文本展示。2、v-html:渲染富文本、HTML片段,注意存在XSS风险,仅信任安全数据时使用。3、v-show:控制元素显示隐藏,通过切换CSS的display属性实现,适合频繁切换显示隐藏的场景,开销小。4、v-if/v-else/v-else-if:条件渲染,通过销毁和创建DOM节点实现,适合切换频率低、权限控制、首次加载按需渲染的场景。5、v-for:列表循环渲染数组、对象数据,支持遍历生成DOM列表。6、v-bind:动态绑定属性(class、style、src等),简写为:,是项目最常用指令。7、v-on:绑定事件(点击、输入、滚动等),简写为@,支持事件修饰符、按键修饰符。8、v-model:双向数据绑定,主要用于表单元素(input、textarea、select),实现数据和视图实时同步。二、Vue核心原理面试题1、说说Vue响应式原理,Vue2和Vue3响应式的区别?参考答案:Vue2响应式原理:基于Object.defineProperty()劫持对象的getter、setter方法。页面渲染时触发getter,收集依赖(记录当前组件用到的该数据);数据修改时触发setter,通知依赖更新,驱动视图重新渲染。缺点非常明显:1、无法监听对象新增、删除的属性;2、无法监听数组下标修改、数组长度修改的变化,只能重写数组7个变异方法(push、pop、shift、unshift、splice、sort、reverse)实现监听;3、层级嵌套过深的对象,需要递归遍历劫持,初始化性能差。Vue3响应式原理:基于ES6的Proxy代理整个对象。直接代理目标对象,拦截对象的读取、修改、新增、删除、数组下标、数组长度变更等所有操作,完美解决Vue2的所有缺陷。同时支持惰性劫持,只劫持用到的属性,无需递归遍历,初始化性能大幅提升。2、Vue的虚拟DOM是什么?diff算法的执行流程?参考答案:虚拟DOM是对真实DOM的抽象描述,本质是一个JS对象,用来记录节点的标签、属性、子节点等信息。因为操作JS对象的速度远快于操作真实DOM,Vue通过虚拟DOM减少真实DOM操作,提升页面渲染性能。diff算法是用来对比新旧虚拟DOM差异的算法,核心是同层比较,不跨层级对比,最大程度复用原有DOM节点,流程分为三步:1、预处理:先对比新旧节点的首尾节点,快速匹配首尾相同的节点,减少循环次数;2、中间列表对比:通过key建立新旧节点映射关系,判断节点是新增、删除、移动;3、递归处理子节点:对有差异的节点,递归对比其子节点,最后只更新差异部分的真实DOM。3、nextTick的作用是什么?原理是什么?参考答案:Vue更新DOM是异步批量更新的,当我们修改数据后,DOM不会立刻更新,而是缓存所有数据变更,等待同一事件循环的所有数据修改完成后,再统一更新DOM。nextTick的作用就是在DOM更新完成后,执行回调函数,让我们可以在代码中实时获取更新后的DOM节点、DOM属性。原理:基于事件循环机制,优先使用微任务(Promise、MutationObserver),微任务不支持的环境降级使用宏任务(setTimeout),将回调延迟到DOM更新完成后执行。日常场景:修改数据后,立刻获取DOM元素的宽高、内容、聚焦等操作,必须放在nextTick中。三、Vue组件与通信面试题1、Vue组件的生命周期有哪些?各自的使用场景?参考答案:生命周期是组件从创建、挂载、更新、销毁的完整过程,常用钩子及场景:1、created:组件实例创建完成,数据、方法已初始化,但DOM未生成、未挂载。场景:发起首次接口请求、初始化数据。2、mounted:组件DOM挂载完成,页面节点已渲染。场景:操作DOM、获取节点、初始化定时器、监听事件、第三方插件初始化。3、updated:数据更新后,DOM重新渲染完成。场景:数据更新后操作最新DOM。4、beforeUnmount:组件销毁前触发。场景:清除定时器、移除全局监听、解绑事件,防止内存泄漏。5、unmounted:组件完全销毁,DOM卸载、数据和方法清空。2、Vue组件之间的通信方式有哪些?适用场景分别是什么?参考答案:1、父子组件通信父传子:props,适合父组件向子组件传递静态/动态数据,可设置类型、默认值、校验规则;子传父:$emit自定义事件,子组件触发事件并携带参数,父组件监听接收数据。2、兄弟组件通信全局事件总线($bus)、pinia/vuex,适合简单兄弟组件传值,bus适合小型项目,状态管理适合中大型项目。3、跨层级/祖孙组件通信provide/inject:祖先组件provide提供数据,任意后代组件inject注入数据,无需逐层传递,适合深层级组件共享数据;4、全局状态通信Vuex(Vue2)/Pinia(Vue3):统一管理全局状态,适合多组件、跨页面共享数据,比如用户信息、全局配置、购物车数据。5、ref/$parent/$children:直接获取组件实例,调用子组件方法、获取子组件数据,适合简单实例操作,不推荐大量使用,耦合度高。3、props校验怎么做?如何设置默认值和必填项?参考答案:开发中不建议直接简写props,必须做参数校验,规范传参、减少报错,具体写法:1、设置类型:支持String、Number、Boolean、Array、Object、Function等;2、required:true/false,设置是否必填;3、default:设置默认值,引用类型(数组、对象)的默认值必须用函数返回;4、validator:自定义校验规则,可校验数值范围、字符串格式等。示例:props:{list:{type:Array,required:false,default:()=>[]}}四、Vue路由与状态管理面试题1、vue-router的hash模式和history模式区别?history模式需要注意什么?参考答案:1、hash模式:URL带有#号,#后面的内容不会发送给后端,仅前端路由解析。兼容性极好,无需后端配置,刷新页面不会404,是默认模式。缺点是URL不够美观。2、history模式:URL无#号,和传统网页地址一致,更美观。基于HTML5的historyAPI实现。history模式重点注意事项:页面刷新时,浏览器会向后端发送当前完整URL请求,后端没有对应路由的话会出现404。需要后端配置兜底路由,将所有请求重定向到index.html,由前端路由解析页面。2、路由守卫有哪些?全局守卫和组件内守卫的使用场景?参考答案:路由守卫核心作用:权限控制、页面拦截、登录校验。1、全局守卫(所有路由跳转都会触发)beforeEach:全局前置守卫,最常用,用于全局登录拦截、权限判断、页面标题修改;afterEach:全局后置守卫,路由跳转完成后触发,用于关闭loading、统计页面访问等。2、组件内守卫(仅当前组件路由生效)beforeRouteEnter:进入路由前触发,无法获取组件this;beforeRouteUpdate:路由参数更新、组件复用不刷新时触发,用于监听路由参数变化更新数据;beforeRouteLeave:离开当前路由前触发,用于离开页面前确认、保存表单数据、清除定时器。3、Pinia相比Vuex的优势是什么?为什么Vue3推荐用Pinia?参考答案:1、结构更简洁:去除了Vuex繁琐的mutations、actions、modules结构,pinia只有state、getters、actions,代码更精简,上手更快。2、支持直接修改state:无需像Vuex必须通过mutations修改数据,既可以直接改,也可以在actions中统一处理,灵活度更高。3、无模块嵌套:自动模块化,无需手动注册modules,每个仓库独立隔离,避免命名冲突。4、完美适配组合式API:和Vue3语法高度契合,支持TS类型推导,类型提示完善,适合大型项目。5、体积更小、性能更好:去除冗余逻辑,打包体积更小,运行效率更高。五、Vue性能优化面试题(实战高频)1、项目中做过哪些Vue性能优化?参考答案:我在项目中从编码、渲染、打包、加载四个维度做过常规优化:1、编码优化:v-for禁止和v-if同级连用、列表使用唯一key、合理使用v-show/v-if、销毁组件时清除定时器和监听、避免频繁操作DOM;2、数据优化:使用computed缓存计算结果,代替重复逻辑计算;高频触发的事件(滚动、输入)使用防抖节流;3、渲染优化:长列表使用虚拟列表,只渲染可视区域DOM,解决大数据列表卡顿;组件按需引入、路由懒加载,减少首屏加载资源;4、打包优化:打包去除console、压缩代码、图片压缩;大文件cdn引入、第三方库按需引入;开启gzip压缩;5、缓存优化:使用keep-alive缓存路由组件,避免重复渲染、重复请求接口。2、computed和watch的区别?各自适用场景?参考答案:核心区别:1、computed是计算属性,依赖缓存,依赖值不变时,多次调用不会重复计算;watch是监听属性,数据每次变化都会触发回调,无缓存。2、computed是同步、纯计算逻辑,不能处理异步;watch支持异步操作(接口请求、延迟操作)。3、computed依赖多个变量可以统一计算;watch专注监听单个或少数几个数据的变化。使用场景:computed:数据拼接、筛选、过滤、计算(总价、筛选列表、格式化数据)等纯逻辑计算;watch:数据变化后需要执行异步操作、复杂逻辑、多步骤处理(监听路由变化、监听表单变化请求接口)。六、Vue常见坑点面试题1、Vue2中数据更新了但页面不渲染的原因及解决办法?参考答案:根本原因是Vue2响应式缺陷,数据变更未被劫持监听,常见场景及解决方案:1、对象新增/删除属性:直接赋值无法监听,页面不更新。解决:使用this.$set新增属性,使用this.$delete删除属性。2、数组通过下标修改、修改数组长度:无法监听变更。解决:使用splice替换下标元素、修改长度,或用$set修改数组项。3、多层嵌套对象深度更新:视图不刷新。解决:手动触发

温馨提示

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

评论

0/150

提交评论