Vue面试题大全(超详细真实面试版)_第1页
Vue面试题大全(超详细真实面试版)_第2页
Vue面试题大全(超详细真实面试版)_第3页
Vue面试题大全(超详细真实面试版)_第4页
Vue面试题大全(超详细真实面试版)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

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

文档简介

Vue面试题大全(超详细真实面试版)一、Vue基础核心面试题(初级必问)1.说说你对Vue的理解,Vue是什么?Vue是一套渐进式、轻量级的前端JavaScript框架,专注于构建用户界面。和React、Angular相比,Vue上手成本更低、文档清晰、生态完善。所谓渐进式,就是可以按需使用:可以只用来替换页面局部DOM,也可以搭建完整的大型单页应用,不用一次性引入所有功能。核心特点:数据驱动视图、组件化开发、双向数据绑定、虚拟DOM、响应式系统。2.Vue2和Vue3的核心区别?(面试高频)我日常开发中体感最明显的区别,整理成面试实用版:架构层面:Vue2是选项式API(OptionsAPI),代码分散;Vue3支持组合式API(Setup),逻辑聚合,适合大型项目复用逻辑响应式原理:Vue2基于Object.defineProperty,无法监听新增、删除属性和数组下标、长度变化;Vue3基于ES6Proxy,完美解决以上问题,监听范围更广性能:Vue3重写了虚拟DOM,编译阶段做了静态提升、补丁标记,渲染速度更快;打包体积更小,支持Tree-shakingTS支持:Vue3原生支持TypeScript,类型推导完善;Vue2对TS支持很鸡肋,需要额外插件生命周期:Vue3组合式API中部分生命周期改名,移除了beforeCreate、created,统一在setup中编写3.Vue的单向数据流和双向绑定区别?单向数据流:父组件传子组件的props,数据只能父改子,子组件不能直接修改props数据,所有数据变更都由父组件驱动,保证数据流向清晰、可追溯。双向绑定:主要是v-model,数据变视图变,视图变数据也变,本质是语法糖:v-model=:value+@input,多用于表单元素。核心原则:Vue中所有props都是单向数据流,双向绑定只用于表单,组件传值严格遵循单向流。4.v-if和v-for优先级、使用注意事项?优先级:Vue2中v-for优先级高于v-if;Vue3中v-if优先级高于v-for。致命坑(面试必答):绝对不要把v-if和v-for写在同一个标签上。原因:Vue2会先循环所有数据,再判断条件,造成性能浪费;Vue3先判断条件,条件为false直接不循环,但逻辑不合理、可读性差。正确写法:外层用template标签写v-if,内层标签写v-for,分层执行。5.key的作用?为什么不能用index做key?key的核心作用:作为虚拟DOM节点的唯一标识,让diff算法可以精准对比新旧节点,避免错误复用DOM,提升更新性能。为什么不推荐index做key:数组删除、插入、排序时,数组下标会重新排序,导致key错乱diff算法会错误复用旧DOM,导致页面渲染错乱、表单数据错位、高亮异常等bug没有唯一标识,无法精准更新节点最佳实践:使用后端返回的唯一id、uuid作为key。6.Vue常用的修饰符有哪些?分别场景?整理工作中最常用、面试常考的:事件修饰符:.stop(阻止冒泡)、.prevent(阻止默认事件)、.once(事件只触发一次)、.self(仅自身触发)按键修饰符:.enter、.esc、.space,监听键盘按键触发事件表单修饰符:.lazy(失焦才更新数据)、.number(转数字)、.trim(去除首尾空格)二、Vue组件通信面试题(高频必考)1.Vue所有组件通信方式汇总(最全版)按场景分类,面试直接背这套:父子通信:props/$emit、$parent/$children、provide/inject、ref兄弟/跨级通信:EventBus事件总线、Vuex/Pinia状态管理全局通信:全局属性挂载、状态管理库2.props和$emit详细使用+注意事项父组件通过props传值给子组件,子组件通过$emit触发自定义事件给父组件传值。工作规范:props必须定义类型、默认值、校验规则,不要直接写数组形式,不利于维护和TS校验。禁止操作:子组件绝对不能直接修改props数据,会报警告,破坏单向数据流,需要修改就通过emit通知父组件修改。3.provide/inject的作用和优缺点用于多层级跨级组件通信,祖先组件provide提供数据,所有后代组件inject注入数据,不用逐层传props。优点:解决props层层穿透的问题,简化深层组件传值缺点:数据响应式处理麻烦(普通数据不响应)、依赖关系不清晰、数据溯源困难,适合全局固定配置、主题色、权限等静态数据,不适合频繁变更的业务数据。4.EventBus的使用和弊端通过创建一个空Vue实例作为事件中心,实现兄弟、跨级组件传值。最大问题(面试重点):事件重复绑定、残留事件。组件销毁时如果不off解绑,会导致页面切换后事件重复触发、内存泄漏。适用场景:小型项目、简单跨组件通信;大型项目统一用Pinia/Vuex。三、Vue响应式原理核心面试题(中高级必问)1.Vue2响应式原理详细讲解Vue2核心:数据劫持+发布订阅模式,基于Object.defineProperty()劫持对象的getter/setter。流程:遍历data中的所有属性,通过defineProperty劫持页面渲染时触发getter,收集依赖(Watcher)数据修改时触发setter,通知Dep发布更新Watcher更新视图,完成数据驱动缺陷:无法监听对象新增/删除属性、无法监听数组下标修改、数组长度修改,所以需要Vue提供的$set、$delete方法。2.Vue3Proxy响应式优势Vue3使用ES6Proxy代理整个对象,而非劫持单个属性。优势:可以监听对象新增、删除属性可以监听数组下标修改、数组长度变化支持监听Map、Set等复杂数据类型无需$set,原生支持全量响应式3.$set的原理和使用场景Vue2中,直接给对象新增属性、通过下标修改数组,不会触发视图更新,因为没有被响应式劫持。$set的作用:手动给新增属性添加响应式劫持,触发视图更新。Vue3中已经废弃$set,Proxy天然支持新增属性响应式。4.computed和watch区别、使用场景computed(计算属性)基于依赖缓存,依赖不变就不会重复计算同步执行,不支持异步适合:数据派生、多数据整合、复杂计算(筛选、拼接、格式化)watch(侦听器)无缓存,数据每次变化都会触发支持异步操作适合:数据变化后执行副作用(请求接口、修改DOM、监听路由、弹窗提示)面试金句:能⽤computed就不用watch,computed性能更好、代码更简洁。四、Vue生命周期面试题1.Vue2完整生命周期+使用场景beforeCreate:实例刚创建,没有data、methods,几乎不用created:数据、方法已挂载,DOM未生成,适合初次请求接口beforeMount:挂载前,模板编译完成mounted:DOM渲染完成,适合操作DOM、初始化第三方插件beforeUpdate:数据更新前updated:数据更新后DOM完成渲染beforeDestroy:组件销毁前,清除定时器、解绑事件、取消请求(防止内存泄漏)destroyed:组件销毁完成2.Vue3生命周期变化组合式API中生命周期钩子需要手动导入,且部分更名:beforeCreate、created被setup替代beforeMount=>onBeforeMountmounted=>onMountedbeforeUpdate=>onBeforeUpdateupdated=>onUpdatedbeforeDestroy=>onBeforeUnmountdestroyed=>onUnmounted五、Vue路由面试题(VueRouter)1.vue-router两种模式区别hash模式(默认)URL带#号,#后面内容不会传给后端基于hashchange事件,兼容性好部署简单,无需后端配置history模式URL干净无#,和正常网页一致基于H5historyAPI缺点:刷新页面会404,需要后端配置重定向,将所有请求指向index.html2.路由守卫有哪些?执行顺序?全局守卫:全局前置守卫beforeEach、全局解析守卫beforeResolve、全局后置守卫afterEach组件守卫:beforeRouteEnter、beforeRouteUpdate、beforeRouteLeave核心场景:beforeEach用于全局登录鉴权、权限拦截、页面标题修改3.路由懒加载原理打包时把路由对应的组件分割成独立的js文件,访问对应路由时才加载对应文件。作用:减小首屏打包体积、提升首屏加载速度、优化页面性能,是大型Vue项目必备优化手段。4.$route和$router区别$router:路由实例,全局路由对象,用于编程式导航(push、replace、go)$route:当前路由信息对象,存放当前页面参数(path、query、params、meta)六、Vuex/Pinia状态管理面试题1.Vuex核心五大属性state:仓库数据源,存放全局状态mutations:唯一修改state的方式,同步执行,支持开发者工具追踪actions:处理异步操作、业务逻辑,通过commit调用mutationsgetters:仓库计算属性,派生状态,缓存数据modules:模块拆分,解决state臃肿、命名冲突问题2.为什么异步逻辑要放在actions,不能放mutations?mutations必须是同步函数,目的是让Vuex开发者工具可以精准追踪每一次状态变更。如果mutations写异步,无法记录变更顺序,调试困难,状态变更不可追溯。所有接口请求、异步延时都要写在actions中。3.Pinia相比Vuex的优势(Vue3必问)去除mutations,结构更简洁,异步同步都在actions中天然支持TS,类型推断完美无需嵌套modules,每个仓库独立,模块化更清晰支持自动解构,不用map辅助函数,代码更简洁体积更小、性能更好、调试更方便七、Vue性能优化面试题(进阶高薪必问)1.日常开发Vue性能优化手段(最全实战版)代码层面:合理使用computed缓存、避免v-if和v-for同级、销毁组件清除定时器/事件监听、减少不必要的全局监听渲染优化:列表高频渲染用虚拟列表、长列表分页、图片懒加载打包优化:路由懒加载、组件懒加载、静态资源CDN、压缩图片、开启Tree-shaking响应式优化:静态数据不做响应式、大型列表冻结Object.freeze、减少不必要的响应式劫持用户体验优化:骨架屏、loading状态、接口缓存、防抖节流处理高频事件2.虚拟DOM和diff算法原理虚拟DOM就是用JS对象模拟真实DOM结构,操作JS对象成本远低于操作真实DOM。页面更新时,生成新虚拟DOM,通过diff算法对比新旧虚拟DOM差异,只更新变化的DOM节点,而非全量重渲染,大幅提升性能。diff核心策略:同层对比、不跨层级对比,通过key精准匹配节点。3.防抖和节流的使用场景防抖:触发高频事件后,延迟n秒执行,期间再次触发重置计时。场景:搜索框输入查询、窗口大小调整节流:固定时间内只执行一次。场景:滚动加载、拖拽、按钮高频点击、resize监听八、Vue高频坑点&实战面试题1.组件data为什么必须是函数?Vue中组件是可复用的,多个组件实例共用一个对象。如果data是对象,所有实例会共享同一份数据,修改一个组件数据,所有复用组件数据都会变。data写成函数,每个组件实例都会调用函数返回一个独立的对象,保证组件数据相互独立、互不干扰。2.双向绑定失效的常见场景及解决办法Vue2新增对象属性:用$set/初始化提前定义字段数组下标修改、长度修改:用splice、$set异步赋值未初始化:提前定义空数据兜底3.内存泄漏的场景和解决方式常见场景:定时器未清除、全局事件未解绑、EventBus事件未off、异步请求未取消、第三方插件实例未销毁。解决:在onBeforeUnmount/beforeDestroy生命周期中统一清除、解绑、销毁实例。4.为什么Vue组件命名推荐短横线命名,不推荐驼峰?HTML标签不区分大小写,驼峰命名在DOM渲染时会自动转为小写,会导致组件识别失败。短横线命名(kebab-case)是HTML标准,兼容性更好、统一规范。九、Vue3专属高频面试题1.setup语法糖的优势无需return变量、方法,代码更简洁无需手动定义props、context,简化写法编译优化,性能更好更好的TS支持,类型推导更精准2.ref和reactive区别和使用场景ref:基本数据类型响应式(字符串、数字、布尔),也可存对象,取值需要.value,模板中自动解包reactive:引用数据类型响应式(对象、数组),

温馨提示

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

评论

0/150

提交评论