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

下载本文档

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

文档简介

Vue高频面试题及详细答案(实战向)一、Vue基础核心面试题1、说说Vue的核心特点Vue是一款轻量级、渐进式的前端框架,核心特点贴合日常开发场景,主要有这几点:渐进式框架:不会强制开发者使用全套功能,可按需引入。可以只用来写页面交互,也可以搭配路由、状态管理、脚手架搭建完整项目,适配小型页面和大型项目。数据双向绑定:核心是数据驱动视图,数据变化自动更新视图,视图修改也能同步更新数据,大幅减少手动操作DOM的代码,提升开发效率。组件化开发:页面可以拆分成独立、可复用的组件,每个组件有自己的模板、样式、逻辑,方便代码复用、维护和团队协作。虚拟DOM:通过虚拟DOM对比新旧节点差异,最小化操作真实DOM,解决原生DOM操作卡顿的问题,提升页面渲染性能。指令系统:内置v-for、v-if、v-show、v-bind、v-on等常用指令,简化页面逻辑编写,同时支持自定义指令拓展功能。2、v-if和v-show的区别,以及使用场景两者都能控制元素的显示和隐藏,核心差异在于渲染机制和性能消耗:v-if:属于惰性渲染,条件为false时,元素完全不会渲染,不生成DOM节点;条件为true时,才会创建DOM、挂载节点。切换显示隐藏时,会频繁触发组件的销毁和重建,有一定渲染开销。v-show:无论条件真假,元素都会首次渲染完成,只是通过切换CSS的display属性控制显隐,不会操作DOM节点,切换开销极小。使用场景:页面切换频率极低(比如弹窗、权限控制显示的模块),用v-if,减少初始页面DOM节点数量,优化首屏渲染。页面频繁切换显示隐藏(比如tab切换、折叠面板),用v-show,避免重复渲染销毁带来的性能损耗。3、Vue中key的作用,为什么不能用index作为keykey的核心作用:key是虚拟DOM节点的唯一标识,用于diff算法中精准对比新旧节点,快速定位节点变化,避免错误复用DOM节点,提升列表更新性能。不推荐用index作为key的原因:当列表发生删除、插入、排序操作时,数组索引会发生变动,导致后续所有节点的index全部改变。diff算法会判定所有节点都发生了变化,触发大面积DOM更新,而非只更新变动的节点,造成性能浪费。更严重的是,如果列表项中有输入框、复选框等表单元素,会出现数据错乱、状态复用的bug,比如删除第一条数据,最后一条数据的表单状态会错误保留。最佳实践:优先使用后端返回的唯一ID、UUID等固定唯一值作为key。4、Vue单向数据流是什么?组件传值为什么不能直接修改props单向数据流:父组件通过props向子组件传值,数据只能由父级流向子级,子组件无法直接修改父组件传递过来的props数据,所有数据变更都由父组件主导。不能直接修改props的原因:Vue官方设计原则是保证数据来源唯一、可追溯。如果子组件可以随意修改props,多个子组件共用同一个父级props数据时,一个子组件的修改会影响其他组件,导致数据状态混乱,后续排查bug极难定位问题源头。正确修改方式:基础类型数据:子组件定义本地data或computed属性,接收props值,修改本地变量;需要同步父组件数据:通过$emit触发自定义事件,通知父组件修改对应数据。二、Vue核心原理面试题1、说说Vue的响应式原理(Vue2版本)Vue2的响应式核心是Object.defineProperty(),通过数据劫持结合发布订阅模式实现,整体流程分为三步:数据劫持:遍历data中的所有属性,通过Object.defineProperty为每个属性设置get和set方法。读取数据时触发get,修改数据时触发set。依赖收集:页面渲染时会读取data数据,此时get方法会触发依赖收集,将当前渲染的Watcher观察者存入Dep订阅器中,记录数据和视图的依赖关系。派发更新:当数据被修改时,set方法触发,Dep会通知所有收集的Watcher,Watcher触发视图重新渲染,完成数据更新视图的闭环。Vue2响应式缺陷:无法监听对象新增/删除属性、数组下标修改、数组长度修改,因此需要$set、$delete手动触发响应式。2、Vue3响应式原理和Vue2的区别Vue3改用Proxy实现响应式,彻底解决了Vue2的响应式缺陷,核心区别如下:劫持方式不同:Vue2是劫持对象单个属性,Vue3Proxy直接劫持整个对象,无需遍历每个属性,性能更好。监听范围更广:支持监听对象新增、删除属性,支持数组下标、数组长度修改,无需额外API即可实现全量响应式。懒响应式:Vue3只有被使用的数据才会触发响应式劫持,未使用的数据不会做处理,减少内存占用;Vue2是初始化就遍历劫持所有data属性。支持Map/Set等复杂数据类型:Proxy可监听所有ES6新增数据结构,Vue2仅支持普通对象和数组。3、Vue虚拟DOM和diff算法原理虚拟DOM:是对真实DOM的JS对象模拟,用简单的key、props、children等属性描述DOM节点结构。页面首次渲染时,根据模板生成虚拟DOM树,再映射为真实DOM;数据更新时,先生成新的虚拟DOM树,通过diff对比新旧树差异,只更新变化的部分。diff算法核心逻辑(同层比较):diff不会跨层级对比节点,只对同一层级的节点进行比较,大幅降低对比复杂度,提升效率:先对比节点类型:类型不同,直接销毁旧节点、创建新节点;类型相同,对比key:key相同判定为同一节点,更新节点属性;key不同,新建节点;列表更新时,通过key建立新旧节点映射关系,实现节点复用、移动、新增、删除,最小化DOM操作。4、Vue生命周期及各阶段使用场景生命周期是组件从创建、挂载、更新到销毁的完整流程,常用钩子及场景如下:beforeCreate:组件实例刚创建,data、methods未初始化,几乎不用。created:实例创建完成,data、方法已初始化,DOM未生成、未挂载。常用场景:页面初始化请求接口、初始化数据。beforeMount:模板编译完成,即将挂载到页面,极少使用。mounted:组件DOM已挂载到页面,页面渲染完成。常用场景:操作DOM、初始化第三方插件(图表、日历)、依赖DOM的接口请求。beforeUpdate:数据更新后,视图重新渲染前触发。updated:视图更新完成,可获取更新后的DOM。beforeUnmount:组件即将销毁。常用场景:清除定时器、解绑全局事件、销毁第三方实例,防止内存泄漏。unmounted:组件完全销毁,清理所有实例。三、组件通信面试题(Vue2/Vue3通用)1、Vue常用的组件通信方式及适用场景根据组件层级不同,对应不同通信方案,日常开发高频使用的有6种:父子组件:props/$emit:父传子用props,子传父用$emit触发事件传参,最基础、最常用的父子通信方式。父子组件:$parent/$children/ref:ref可直接获取子组件实例,调用子组件方法、获取子组件数据;$parent/$children访问上下级组件实例,适合简单场景,不适合复杂层级。跨层级/祖孙组件:provide/inject:祖先组件通过provide提供数据,后代任意层级组件通过inject注入数据,无需逐层传参,适合全局通用数据(主题、权限)。任意组件:事件总线($bus):创建全局Vue实例作为事件中心,通过$on、$emit实现平级、跨级通信,适合小型项目简单跨组件传值。任意组件:Vuex/Pinia:全局状态管理,适合中大型项目,统一管理全局公共数据(用户信息、路由、全局配置),支持数据持久化、状态监听。平级组件:借助父组件中转:两个平级组件无法直接通信,可通过父组件存储公共数据,实现数据中转。2、provide/inject有什么缺陷?怎么解决缺陷:默认是非响应式的,祖先组件数据更新后,后代组件无法同步更新;数据来源不清晰,多层嵌套后,无法直观判断数据来自哪个祖先组件,不利于维护。解决方案:Vue2中可传递响应式对象、computed计算属性实现响应式;Vue3直接配合ref/reactive使用,即可实现数据双向同步。复杂全局状态不建议用provide/inject,优先用Pinia。四、Vue进阶实战面试题1、computed和watch的区别和使用场景核心区别:计算属性computed:基于依赖数据缓存结果,依赖不变则多次调用不会重复计算;属于属性计算,有返回值,支持链式调用;默认是惰性的。侦听器watch:无缓存,数据每次变化都会触发执行;主要用于监听数据变更后的异步/复杂操作,无返回值。使用场景:简单数据换算、拼接、过滤(如字符串格式化、状态文字转换),用computed;数据变化后需要执行异步请求、定时器、复杂逻辑判断,用watch。2、Vue路由守卫有哪些?全局守卫执行顺序路由守卫用于控制页面跳转权限、登录校验、页面标题设置,常用分为三类:全局守卫:router.beforeEach(全局前置守卫)、router.afterEach(全局后置守卫)路由独享守卫:beforeEnter(单个路由单独配置)组件内守卫:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave完整执行顺序:全局前置beforeEach=>路由独享beforeEnter=>组件内beforeRouteEnter=>路由跳转确认=>全局后置afterEach常用场景:beforeEach做全局登录权限拦截、白名单配置;afterEach做页面标题修改、页面滚动重置。3、Vue路由懒加载原理及作用原理:基于ES6动态import()语法,实现代码分割。打包时不会将所有路由页面代码打包到一个主文件,而是将每个路由组件单独打包为独立chunk文件。作用:减小首屏打包体积,加快首屏加载速度,优化页面白屏时间;按需加载,访问对应路由时才加载对应页面代码,节省浏览器资源。4、Vue常见性能优化方案(实战常用)整理项目中落地的实用优化手段,分为编译、运行、打包三个维度:页面渲染优化:v-for必须加唯一key、v-for和v-if禁止同级使用、长列表虚拟滚动、频繁切换用v-show。数据优化:合理使用computed缓存计算结果、销毁组件前清除定时器/事件监听、避免不必要的响应式数据。打包优化:路由懒加载、组件按需引入、UI库按需导入、开启gzip压缩、剔除打包冗余代码。体验优化:图片懒加载、接口请求缓存、首屏加载加载动画、路由切换进度条。5、Vue中v-for和v-if为什么不能同级使用?怎么优化原因:Vue编译优先级中,v-for优先级高于v-if。如果同级使用,会先循环遍历所有列表项,再根据条件判断是否显示,哪怕只需要展示少量数据,也会完整遍历整个数组,造成严重性能浪费。优化方案:条件过滤列表数据:提前在computed中过滤数组,v-for直接遍历过滤后的数组;层级嵌套:将v-if写在v-for的外层标签上,先判断条件再执行循环。五、Vue3专项高频面试题1、setup函数的特点和执行时机setup是Vue3组合式API的核心入口,执行时机在组件创建之前,beforeCreate之前,此时组件实例尚未生成,无法使用this。核心特点:函数内部没有this,无法访问组件实例;所有响应式数据、方法、生命周期都需要在setup中定义;返回的变量和方法,可以直接在模板中使用;只能执行同步代码,不支持异步setup(普通场景)。2、ref和reactive的区别及使用场景区别:ref:用于定义基础类型数据(字符串、数字、布尔),也可定义对象;底层通过value属性实现响应式,模板使用无需.value,脚本中需要.value取值修改。reactive:专门用于定义引用类型数据

温馨提示

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

评论

0/150

提交评论