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

下载本文档

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

文档简介

Vue3高频面试题及详细答案(实战向)一、基础认知类1、Vue3相比Vue2有哪些核心优势?整体性能、开发体验、项目维护性都有全方位提升,核心亮点如下:性能更强:重写了虚拟DOM,优化了diff算法,静态节点直接标记、跳过对比,更新速度大幅提升;同时支持按需编译,打包体积更小。响应式升级:放弃Vue2的Object.defineProperty,改用Proxy实现响应式,解决了数组下标、对象新增/删除属性无法监听的痛点。组合式API:替代选项式API,可按业务逻辑拆分代码,不再按data、methods、watch划分,复杂项目代码更清晰、复用性更高。更好的TS支持:源码基于TS重写,天然适配类型推导,类型校验更严谨,适合中大型项目开发。全新生命周期与特性:新增setup语法、teleport、suspense、多根节点等功能,开发场景更灵活。打包优化:支持Tree-shaking,未使用的API不会打包到最终代码,减少项目体积。2、Vue3为什么选用Proxy替代Object.defineProperty?Vue2的Object.defineProperty存在诸多局限,无法适配复杂数据监听场景,具体问题和Proxy优势如下:监听范围更广:Object.defineProperty只能监听对象已有属性的读取和修改,无法监听新增、删除属性;Proxy可以拦截对象属性的增、删、改、查,还能监听数组的所有操作(下标修改、长度修改、push、splice等)。无需遍历递归:Object.defineProperty需要递归遍历对象、数组的每一个属性才能实现深度监听,性能开销大;Proxy是对整个对象做代理,深度监听可按需触发,性能更优。支持更多拦截操作:Proxy提供十余种拦截方法,可监听对象原型、属性查询、阻止默认行为等,能实现更全面的响应式能力。唯一缺点是Proxy无法兼容IE浏览器,但目前前端项目基本不再适配IE,该问题可以忽略。3、Vue3兼容Vue2语法吗?完全兼容。Vue3保留了Vue2的选项式API(data、methods、computed、watch等),老项目可以直接升级,无需大规模改写。但官方更推荐新项目使用组合式API,兼顾代码复用和逻辑拆分;同时部分废弃的小众API(如filter、事件修饰符.native)需要适配修改。二、组合式API核心考点4、setup函数的执行时机和特点?setup是组合式API的核心入口,执行时机早于所有生命周期钩子,在beforeCreate之前执行。核心特点:执行时组件实例尚未创建,无法获取this,所有依赖实例的操作都不能使用。内部定义的变量、方法,必须通过return暴露出去,模板才能使用。不能使用Vue2的选项式API相关配置,比如data、methods无法在setup中混用生效。支持同步代码,不支持异步直接返回模板所需数据(异步需配合await或onMounted)。5、ref和reactive的区别?各自使用场景?两者都是Vue3创建响应式数据的核心方法,核心差异在于监听数据类型和使用方式:ref支持基本数据类型(字符串、数字、布尔)和引用数据类型(对象、数组)。本质是创建一个包装对象,通过.value属性维护响应式,脚本中修改数据必须加.value,模板中可省略。简单、轻量,适合单个基础值、简单状态的定义。reactive仅支持引用数据类型(对象、数组),无法监听基础数据类型。基于Proxy实现,无需.value,直接修改属性即可触发响应式。适合复杂对象、批量状态、表单数据、列表数据等场景。最佳实践基础类型用ref,复杂对象用reactive;简单状态优先ref,结构复杂的数据优先reactive。6、toRef、toRefs的作用和区别?核心作用:解决reactive解构赋值丢失响应式的问题。toRef单独为reactive对象中的某个属性创建响应式引用。新旧数据保持关联,修改新值会同步更新原对象数据。适用场景:只需要对象中个别属性,不想解构全部数据。toRefs将整个reactive响应式对象全部属性批量转为ref。可以直接解构使用,不丢失响应式,是项目中最常用的方式。适用场景:需要批量获取对象多个属性,简化代码书写。注意:普通对象解构会丢失响应式,必须用toRefs解构reactive数据。7、computed计算属性用法和特点?computed是基于依赖缓存的响应式计算方法,依赖数据不变则不会重新计算,性能优于直接写表达式。两种写法只读写法:传入回调函数,默认只读,无法手动修改值。读写写法:传入包含get、set的对象,可监听计算属性的修改,手动更新依赖数据。核心特点有缓存机制,依赖不变,多次调用只执行一次。同步执行,不支持异步逻辑。数据响应式联动,依赖更新自动重新计算。8、watch和watchEffect的区别?两者都是监听数据变化的方法,核心差异在依赖收集、执行时机、使用方式:watch手动指定监听依赖,明确监听哪个数据。默认初始不执行,只有数据变化才触发,可配置immediate初始立即执行。可以获取新值、旧值,支持深度监听(deep)。适合:数据变化后需要执行异步操作、复杂逻辑、对比新旧值的场景。watchEffect自动收集依赖,回调中用到的响应式数据,都会被自动监听。组件初始化时立即执行一次,无需配置immediate。无法获取旧值,默认就是深度监听。适合:无需对比新旧值,只需数据变化自动执行逻辑的场景。三、生命周期考点9、Vue3生命周期和Vue2的区别?整体生命周期逻辑一致,主要是命名调整、组合式API适配、废弃部分钩子:Vue3组合式API中,beforeCreate、created被setup替代,setup涵盖两个钩子的功能。部分钩子重命名,语义更清晰:beforeMount→onBeforeMount、mounted→onMounted,全部以on开头。废弃了beforeDestroy、destroyed,替换为onBeforeUnmount、onUnmounted。新增生命周期钩子:onRenderTracked、onRenderTriggered,用于调试渲染更新逻辑。10、常用Vue3生命周期钩子及使用场景?setup:组件初始化,定义响应式数据、方法、监听。onBeforeMount:挂载前执行,可修改初始数据,无法操作DOM。onMounted:组件挂载完成,DOM渲染完毕,用于请求接口、操作DOM、初始化第三方插件。onBeforeUpdate:数据更新前执行,可获取更新前的DOM状态。onUpdated:数据更新完成,DOM更新完毕,执行更新后的DOM操作。onBeforeUnmount:组件卸载前,清除定时器、监听、事件绑定,防止内存泄漏。onUnmounted:组件卸载完成,收尾清理工作。四、响应式原理核心11、Vue3响应式原理完整流程?核心流程:数据代理→依赖收集→视图更新数据代理:通过Proxy对目标对象做代理,拦截对象的读取、修改、删除等操作,通过Reflect完成属性的读写操作,保证数据原生特性。依赖收集:组件渲染时,读取响应式数据,触发getter拦截,将当前组件的渲染副作用函数收集到依赖容器中,建立数据和视图的关联。触发更新:当数据被修改时,触发setter拦截,找到当前数据对应的所有依赖副作用函数。视图重渲染:执行收集的副作用函数,重新渲染组件DOM,完成视图更新。12、为什么要用Reflect?不用可以吗?不建议不用,Reflect是配合Proxy的最佳方案,解决了Proxy拦截操作的原生问题:Reflect方法返回布尔值,能判断属性操作是否成功,避免报错。修正了this指向问题,保证代理对象的this指向正确。兼容对象新增、删除、属性查询等所有操作,让Proxy拦截逻辑更完整规范。13、Vue3响应式丢失的常见场景及解决办法?日常开发高频踩坑点,重点掌握:场景1:直接解构reactive对象,解决:使用toRefs批量解构。场景2:直接替换整个reactive对象(state={}),解决:不要直接赋值,修改内部属性,或用ref定义。场景3:响应式数据赋值给普通变量,解决:用toRef关联属性,保持响应式。场景4:数组下标、长度修改(Vue2痛点,Vue3已修复,无需处理)。五、组件与通信考点14、Vue3组件通信的所有方式?覆盖父子、兄弟、跨级、全局通信,完整方案:父子通信:父传子(props)、子传父(defineEmits)、子暴露数据给父(defineExpose)。跨级/深层通信:provide/inject,无需层层传递props。兄弟/全局通信:mitt事件总线、Pinia全局状态管理。组件获取实例:ref获取子组件实例,直接调用子组件方法。15、setup语法糖中defineProps、defineEmits、defineExpose特点?三个都是setup语法糖专属编译宏,无需导入,直接使用,仅在组件内部生效:defineProps:接收父组件传值,支持类型校验、默认值,写法更简洁,无需在setup参数中接收。defineEmits:声明子组件触发的自定义事件,用于子传父,可规范事件参数。defineExpose:默认情况下,父组件通过ref无法获取子组件的属性和方法,通过该API主动暴露,父组件才可调用。16、provide/inject的优缺点?优点:解决多层嵌套组件props层层透传的问题,跨层级传值简洁高效。缺点:数据溯源困难,不知道数据来自哪个父组件;响应式需要手动处理,直接传普通值不具备响应式。解决方案:传递ref、reactive响应式数据,保证数据联动更新。六、Vite与Vue3工程化考点17、Vite和Webpack的区别?为什么Vue3项目多用Vite?Vite是基于原生ES模块的构建工具,相比Webpack打包构建,开发体验优势极大:启动速度:Webpack需要打包所有文件后启动服务;Vite启动无需打包,直接基于浏览器ESModule按需加载,启动秒开。热更新:Webpack热更新需要重新编译打包;Vite精准更新修改的模块,热更新速度极快,不受项目体积影响。打包性能:生产环境打包同样更快,内置优化,开箱即用。缺点:部分老插件适配不如Webpack成熟,大型项目打包兼容性略逊于Webpack。七、性能优化与实战问题18、Vue3项目常用性能优化方案?结合日常开发实战,高频优化手段:数据优化:合理使用ref/reactive,避免无效响应式;大型数据、静态数据无需响应式用markRaw标记。渲染优化:使用v-once渲染静态内容,避免重复渲染;长列表使用虚拟列表,减少DOM节点。计算与监听优化:优先用computed缓存数据,减少重复计算;合理控制watch深度监听,避免无效监听。打包优化:路由懒加载、组件异步引入;开启Tree-shaking;压缩资源、按需引入UI组件库。内存优化:组件卸载时清除定时器、事件监听、定时器,避免内存泄漏。19、markRaw与shallowRef/shallowReactive的作用?三者都是浅层响应式/取消响应式优化API,用于减少不必要的响应式开销:markRaw:标记数据永久非响应式,适合第三方实例、大型静态数据、不需要更新的对象,跳过响应式劫持,提升性能。shallowRef:浅层ref,只监听.v

温馨提示

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

评论

0/150

提交评论