Vue 前端高频面试题(附接地气详细答案)_第1页
Vue 前端高频面试题(附接地气详细答案)_第2页
Vue 前端高频面试题(附接地气详细答案)_第3页
Vue 前端高频面试题(附接地气详细答案)_第4页
Vue 前端高频面试题(附接地气详细答案)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

Vue前端高频面试题(附接地气详细答案)一、Vue基础核心面试题1.说说Vue2和Vue3的核心区别?参考答案:我日常开发中感触最深的就是这几点,都是实战层面的区别:1)响应式原理不同:Vue2用Object.defineProperty劫持对象属性,数组靠重写方法,存在监听不到新增、删除属性,以及数组下标修改的问题;Vue3用Proxy代理整个对象,完美解决上述缺陷,支持监听数组、新增属性、删除属性,覆盖面更广。2)API风格不同:Vue2是Options选项式API,data、methods、computed分开写,大型组件代码碎片化,不好维护;Vue3支持组合式API(setup),可以按业务逻辑聚合代码,复用性、可读性更强,也兼容选项式API。3)生命周期调整:Vue3移除了beforeCreate、created,逻辑统一放到setup里;部分生命周期改名,比如beforeMount、mounted保留,beforeUpdate、updated不变,销毁相关改成beforeUnmount、unmounted。4)性能和体积优化:Vue3做了编译层优化,静态节点直接跳过diff,减少渲染开销;同时支持tree-shaking,按需引入API,打包体积更小,初始化和更新速度比Vue2快很多。5)新增特性:新增Teleport、Suspense、Fragment,支持多根节点组件,解决了Vue2单根节点的痛点。2.Vue响应式原理到底是什么?分别说下Vue2和Vue3参考答案:响应式的核心就是数据劫持+依赖收集+视图更新,只是两代实现方式不一样。Vue2响应式:通过Object.defineProperty对对象的每一个属性劫持get、set方法。页面渲染时触发get进行依赖收集,记录当前组件的Watcher;数据修改时触发set,通知Watcher更新视图。缺陷很明显:一是只能监听已有的属性,对象新增、删除属性无法监听,需要用$set;二是数组不能监听下标修改和长度修改,只能通过重写push、pop、splice等方法实现监听。Vue3响应式:使用ES6Proxy代理整个数据对象,不需要遍历每一个属性。可以监听对象的新增、删除属性,数组下标、长度修改,甚至能监听Map、Set等数据结构。配合Reflect操作源数据,保证上下文指向正确,彻底解决了Vue2的响应式漏洞。3.data为什么在Vue2中是函数,Vue3可以是对象?参考答案:核心原因是避免组件复用导致的数据污染。Vue2中组件是可复用的实例,如果data写成对象,所有复用的组件会共用同一个内存地址的对象,一个组件修改数据,其他组件数据也会跟着变。写成函数后,每次创建组件实例都会执行一次data函数,返回一个全新的独立对象,每个组件的数据相互独立,不会互相影响。Vue3组合式API的setup函数每次组件实例创建都会重新执行,响应式数据都是重新声明生成的,天然独立,所以不需要强制写函数。4.v-if和v-for为什么不建议一起使用?优先级谁高?参考答案:优先级:Vue2中v-for优先级高于v-if,Vue3反过来v-if优先级更高。不管哪个版本,都不建议一起用,核心问题是性能浪费:Vue2中,会先循环遍历所有列表项,再逐个判断条件隐藏/显示,哪怕列表大部分都不需要展示,也会完整执行一次循环,极大浪费性能。Vue3虽然先判断条件再循环,但逻辑可读性极差,容易出现bug,比如条件依赖循环变量时容易报错。最优解决方案:外层用template或者父元素做v-if判断,内层做v-for循环;或者提前在computed中过滤列表数据,再直接渲染。5.Vuekey的作用是什么?为什么不建议用index做key?参考答案:key是虚拟DOMdiff算法的唯一标识,作用是精准区分节点,避免错误复用DOM,提升更新性能。diff对比时,会通过key判断新旧节点是否是同一个节点,key相同就复用DOM,不同就销毁重建。不建议用index做key的原因:数组进行删除、插入、排序操作时,数组下标会发生变化,导致key错乱。diff会错误复用旧DOM,出现数据和视图不匹配、表单输入值错乱、样式错乱等问题。日常开发优先用后端返回的唯一id、uuid,只有静态固定、不会增删排序的列表,才可以用index。二、Vue核心原理面试题6.说说Vue虚拟DOM和diff算法流程参考答案:虚拟DOM就是用JS对象模拟真实DOM结构,包含节点类型、属性、子节点等信息,操作JS对象比操作真实DOM性能高很多。数据更新时,Vue会生成新的虚拟DOM树,通过diff算法对比新旧虚拟DOM,只更新差异部分,不用全量重渲染,提升页面性能。diff核心流程(同层对比,不跨层比较):1)先对比节点类型:类型不同,直接销毁旧节点,创建新节点;2)类型相同,对比属性,更新差异属性;3)对比子节点:文本子节点直接替换;数组子节点通过key做精准对比,进行增、删、移、改操作。Vue3对diff做了大量优化,增加静态标记、patch优先级,静态节点直接跳过对比,动态节点精准更新,效率更高。7.双向绑定原理?v-model底层是什么?参考答案:Vue双向绑定核心:数据劫持+视图更新+事件监听。v-model本质是语法糖,并不是自带双向绑定,底层等价于::value绑定数据+@input监听输入事件修改数据。原生input框:v-model会自动绑定value,监听input事件;自定义组件中,父组件v-model,等价于给子组件传modelValue属性,子组件触发update:modelValue事件更新父组件数据。简单说:视图变了改数据,数据变了更视图,实现双向同步。8.computed和watch的区别?各自使用场景参考答案:核心区别:1)缓存机制:computed有缓存,依赖数据不变时,多次读取不会重复计算;watch无缓存,数据每次变化都会触发执行。2)执行机制:computed是依赖追踪的惰性计算,页面渲染用到才执行;watch是数据监听,数据立即监听变化。3)数据限制:computed必须有返回值,依赖多个数据;watch无返回值,专注监听单个/多个数据变化。使用场景:computed:适合数据计算、筛选、格式化,比如总价计算、列表过滤、时间格式化、拼接文本。watch:适合数据变化后的异步操作、复杂逻辑,比如接口请求、定时器、弹窗开关监听、路由变化处理。9.Vue生命周期有哪些?常用钩子和场景参考答案:生命周期就是组件从创建、挂载、更新、销毁的完整流程,Vue3常用钩子:1)setup:组件创建阶段,替代beforeCreate、created,用来定义响应式数据、方法、发起初始接口请求。2)onMounted:DOM挂载完成,页面DOM可获取,适合操作DOM、初始化第三方插件、请求页面初始数据。3)onUpdated:数据更新、DOM重新渲染后触发,适合更新后操作最新DOM。4)onBeforeUnmount:组件销毁前触发,用来清除定时器、解绑事件、取消请求,防止内存泄漏。5)onUnmounted:组件销毁完成,清理残余资源。日常开发90%场景只用setup、onMounted、onBeforeUnmount三个钩子。三、Vue组件与通信面试题10.Vue组件通信方式有哪些?适用场景参考答案:我按组件层级和业务场景区分使用:1)父子组件父传子:props传参,简单清晰,适合静态、动态数据传递;子传父:自定义事件emit,子组件触发事件携带参数给父组件;父子互传:v-model、defineModel(Vue3新语法)。2)跨级/深层组件provide/inject:祖辈向后代穿透传值,无需层层透传,适合全局主题、配置、权限数据。3)任意组件(兄弟、跨页面)全局事件总线(Vue2)、mitt(Vue3):轻量事件通信,适合简单跨组件交互;Pinia/Vuex:状态管理,适合全局共享数据,比如用户信息、购物车、全局状态。4)特殊方式$parent、$children、$refs:直接操作组件实例,不推荐,耦合度太高;localStorage、sessionStorage:本地持久化存储,适合非实时全局数据。11.props怎么校验?为什么要做校验?参考答案:开发中都会对props做类型、必填、默认值、自定义校验规则约束。基础校验可以限制类型、是否必填、默认值;复杂场景可以写validator自定义校验函数,判断传入数据是否符合规则。校验的意义:1)规范组件入参,避免父组件传错参数导致子组件报错;2)报错提示清晰,控制台会精准提示参数类型错误,方便排查问题;3)提升组件复用性和稳定性,多人协作时统一传参规范。12.组件封装时,props和emits怎么规范书写?参考答案:Vue3项目中我都会用defineProps、defineEmits语法糖,完整规范书写:props明确类型、默认值、是否必填、自定义校验;emits提前声明所有自定义事件,统一事件名和传参规范。好处是代码可读性高、类型约束严格,后续维护和他人使用组件不会乱传参、乱定义事件,减少隐性bug。四、Vue工程化与实战坑点13.Vue性能优化你做过哪些?参考答案:结合项目实战,我常用的优化分为几类:1.编码层面优化1)v-for加唯一key,避免用index;杜绝v-if和v-for混用;2)高频数据计算用computed缓存,避免模板内复杂表达式;3)合理使用watch,开启immediate、debounce防抖,减少频繁请求;4)大数据列表用虚拟滚动,只渲染可视区域DOM,避免页面卡顿。2.渲染性能优化1)频繁更新的独立数据用v-once静态渲染、v-memo缓存组件;2)拆分细粒度组件,局部更新,减少全组件重渲染;3)销毁组件时清除定时器、事件监听、请求,防止内存泄漏。3.打包优化1)路由懒加载、组件按需引入,减小首屏加载体积;2)UI库、第三方库按需引入,开启tree-shaking;3)打包压缩图片、静态资源,去除冗余代码。14.路由懒加载原理?为什么能优化首屏?参考答案:路由懒加载就是利用ES6动态import()语法,实现组件按需加载。不做懒加载时,所有页面组件打包会合并到一个大js文件,首屏必须加载完所有代码才能渲染页面,导致首屏加载慢。懒加载后,不同路由页面会打包成独立的chunk文件,只有访问对应路由时,才会加载对应页面的代码。首屏只需要加载首页代码,极大减少首屏资源体积,提升首屏渲染速度。15.Vue刷新页面后数据丢失怎么解决?参考答案:因为Pinia/Vuex数据是存在内存中的,页面刷新后内存释放,数据就会清空。实战解决方案:1)核心全局数据(用户token、用户信息),更新状态的同时同步存储到localStorage;2)页面初始化时,在入口文件读取本地存储数据,重新赋值给状态管理;3)临时页面数据可用sessionStorage,关闭页面自动清空,更安全。16.说说你对Vue单向数据流的理解参考答案:Vue是单向数据流,父组件通过props传值给子组件,子组件不能直接修改props数据。直接修改会报错,且数据流向混乱,无法追溯数据变更来源,项目难以维护。正确做法:子组件接收props后,要么拷贝一份本地数据修改,要么通过emit触发事件,让父组件自己修改源数据,保证数据单向、可追溯。五、Vue3高频专项面试题17.setup语法糖的特点?执行时机?参考答案:setup是Vue3组合式API的核心语法糖,<scriptsetup>语法下,代码更简洁,无需手动return变量和方法,模板可直接使用。执行时机:组件创建之前,早于所有生命周期,替代了beforeCreate和created。特点:自动解构、自动注册组件、无需手动暴露变量、支持顶层await,开发效率远高于选项式API。18.ref和reactive的区别?怎么选择使用?参考答案:区别:1)ref用来定义基本数据类型(字符串、数字、布尔),也可以定义对象,数据会包裹在.value中;2)reactive专门定义引用数据类型(对象、数组),无需.value,直接操作;3)ref底层依然是调用reactive实现,是reactive的二次封装。使用规范:简单基础数据、单个状态用ref;复杂对象、表单数据、列表数据统一用reactive,代码更简洁。19.watch和watchEffect区别?参考答案:1)依赖收集方式:watch需要手动指定监听的数据源;watchEffect自动收集函数内用到的响应式数据,数据变化就触发。2)执行时机:watch默认初始不执行,需要手动开启immediate;watchEffect组件初始化会自动执行一次。3)功能差异:watch可以获取新旧值,支持防抖、节流;watchEffect更简洁,适合简单的

温馨提示

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

评论

0/150

提交评论