2024前端高频面试题之VUE篇导读本文总结了前端面试中经常问到的vue高频面试题,仅供参考。下图为思维导图:

【导读】本文总结了前端面试中经常问到的vue高频面试题,仅供参考。

beforeCreate是newVue()之后触发的第一个钩子,在当前阶段data、methods、computed以及watch上的数据和方法都不能被访问。

created在实例创建完成后发生,当前阶段已经完成了数据观测,也就是可以使用数据,更改数据,在这里更改数据不会触发updated函数。可以做一些初始数据的获取,在当前阶段无法与Dom进行交互,如果非要想,可以通过vm.$nextTick来访问Dom。

beforeMount发生在挂载之前,在这之前template模板已导入渲染函数编译。而当前阶段虚拟Dom已经创建完成,即将开始渲染。在此时也可以对数据进行更改,不会触发updated。

mounted在挂载完成后发生,在当前阶段,真实的Dom挂载完毕,数据完成双向绑定,可以访问到Dom节点,使用$refs属性对Dom进行操作。

beforeUpdate发生在更新之前,也就是响应式数据发生更新,虚拟dom重新渲染之前被触发,你可以在当前阶段进行更改数据,不会造成重渲染。

updated发生在更新完成之后,当前阶段组件Dom已完成更新。要注意的是避免在此期间更改数据,因为这可能会导致无限循环的更新。

beforeDestroy发生在实例销毁之前,在当前阶段实例完全可以被使用,我们可以在这时进行善后收尾工作,比如清除计时器。

destroyed发生在实例销毁之后,这个时候只剩下了dom空壳。组件已被拆解,数据绑定被卸除,监听被移出,子实例也统统被销毁。

Vue3.x改用Proxy替代Object.defineProperty。因为Proxy可以直接监听对象和数组的变化,并且有多达13种拦截方法。并且作为新标准将受到浏览器厂商重点持续的性能优化。

Proxy只会代理对象的第一层,那么Vue3又是怎样处理这个问题的呢?

(很简单啊)

判断当前Reflect.get的返回值是否为Object,如果是则再通过reactive方法做代理,这样就实现了深度观测。

监测数组的时候可能触发多次get/set,那么如何防止触发多次呢?

我们可以判断key是否为当前被代理对象target自身属性,也可以判断旧值与新值是否相等,只有满足以上两个条件之一时,才有可能执行trigger。

MVVM是Model-View-ViewModel缩写,也就是把MVC中的Controller演变成ViewModel。Model层代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会绑定到viewModel层并自动将数据渲染到页面中,视图变化的时候会通知viewModel层更新数据。

使用了函数劫持的方式,重写了数组的方法,Vue将data中的数组进行了原型链重写,指向了自己定义的数组原型方法。这样当调用数组api时,可以通知依赖更新。如果数组中包含着引用类型,会对数组中的引用类型再次递归遍历进行监控。这样就实现了监测数组变化。

v-model本质就是一个语法糖,可以看成是value+input方法的语法糖。可以通过model属性的prop和event属性来进行自定义。原生的v-model,会根据标签的不同生成不同的事件和属性。

简单来说,diff算法有以下过程

在创建VNode时就确定其类型,以及在mount/patch的过程中采用位运算来判断一个VNode的类型,在这个基础之上再配合核心的Diff算法,使得性能上较Vue2.x有了提升。(实际的实现可以结合Vue3.x源码看。)

该算法中还运用了动态规划的思想求解最长递归子序列。

父子组件通信

父->子props,子->父$on、$emit

获取父子组件实例$parent、$children

Ref获取实例的方式调用组件的属性或者方法

Provide、inject官方不推荐使用,但是写组件库时很常用

兄弟组件通信

EventBus`实现跨组件通信`Vue.prototype.$bus=newVueVuex跨级组件通信

Vuex$attrs、$listeners9.Vue的路由实现,hash路由和history路由实现原理说一下`location.hash`的值实际就是URL中`#`后面的东西。history实际采用了HTML5中提供的API来实现,主要有history.pushState()和history.replaceState()。

当条件不成立时,v-if不会渲染DOM元素,v-show操作的是样式(display),切换当前DOM的显示和隐藏。

keep-alive可以实现组件缓存,当组件切换时不会对当前组件进行卸载。

常用的两个属性include/exclude,允许组件有条件的进行缓存。

两个生命周期activated/deactivated,用来得知当前组件是否处于活跃状态。

keep-alive的中还运用了LRU(LeastRecentlyUsed)算法。

在下次DOM更新循环结束之后执行延迟回调。nextTick主要使用了宏任务和微任务。根据执行环境分别尝试采用

定义了一个异步方法,多次调用nextTick会将方法存入队列中,通过这个异步方法清空当前队列。

SSR也就是服务端渲染,也就是将Vue在客户端把标签渲染成HTML的工作放在服务端完成,然后再把html直接返回给客户端。

SSR有着更好的SEO、并且首屏加载速度更快等优点。不过它也有一些缺点,比如我们的开发条件会受到限制,服务器端渲染只支持beforeCreate和created两个钩子,当我们需要一些外部扩展库时需要特殊处理,服务端渲染应用程序也需要处于Node.js的运行环境。还有就是服务器会有更大的负载需求。

一个组件被复用多次的话,也就会创建多个实例。本质上,这些实例用的都是同一个构造函数。如果data是对象的话,对象属于引用类型,会影响到所有的实例。所以为了保证组件不同的实例之间data不冲突,data必须是一个函数。

当组件实例触发生命周期函数beforeCreate后,它会做一系列事情,其中就包括对computed的处理。

它会遍历computed配置中的所有属性,为每一个属性创建一个Watcher对象,并传入一个函数,该函数的本质其实就是computed配置中的getter,这样一来,getter运行过程中就会收集依赖

但是和渲染函数不同,为计算属性创建的Watcher不会立即执行,因为要考虑到该计算属性是否会被渲染函数使用,如果没有使用,就不会得到执行。因此,在创建Watcher的时候,它使用了lazy配置,lazy配置可以让Watcher不会立即执行。

收到lazy的影响,Watcher内部会保存两个关键属性来实现缓存,一个是value,一个是dirty

value属性用于保存Watcher运行的结果,受lazy的影响,该值在最开始是undefined

dirty属性用于指示当前的value是否已经过时了,即是否为脏值,受lazy的影响,该值在最开始是true

Watcher创建好后,vue会使用代理模式,将计算属性挂载到组件实例中

当读取计算属性时,vue检查其对应的Watcher是否是脏值,如果是,则运行函数,计算依赖,并得到对应的值,保存在Watcher的value中,然后设置dirty为false,然后返回。

如果dirty为false,则直接返回watcher的value

巧妙的是,在依赖收集时,被依赖的数据不仅会收集到计算属性的Watcher,还会收集到组件的Watcher

当计算属性的依赖变化时,会先触发计算属性的Watcher执行,此时,它只需设置dirty为true即可,不做任何处理。

由于依赖同时会收集到组件的Watcher,因此组件会重新渲染,而重新渲染时又读取到了计算属性,由于计算属性目前已为dirty,因此会重新运行getter进行运算

而对于计算属性的setter,则极其简单,当设置计算属性时,直接运行setter即可。

在使用vue的时候,我们有两种方式来创建我们的HTML页面,第一种情况,也是大多情况下,我们会使用模板template的方式,因为这更易读易懂也是官方推荐的方法;第二种情况是使用render函数来生成HTML,它比template更接近最终结果。

complier的主要作用是解析模板,生成渲染模板的render,而render的作用主要是为了生成VNode

complier主要分为3大块:

React和Vue有许多相似之处,它们都有:

建议面试前通读一遍该篇文档,然后进行适当的总结。

区别:

watch的参数:

computed缓存原理:

conputed本质是一个惰性的观察者;当计算数据存在于data或者props里时会被警告;

vue初次运行会对computed属性做初始化处理(initComputed),初始化的时候会对每一个computed属性用watcher包装起来,这里面会生成一个dirty属性值为true;然后执行defineComputed函数来计算,计算之后会将dirty值变为false,这里会根据dirty值来判断是否需要重新计算;如果属性依赖的数据发生变化,computed的watcher会把dirty变为true,这样就会重新计算computed属性的值。

在vue中修饰符可以分为3类:

事件修饰符

在事件处理程序中调用event.preventDefault或event.stopPropagation方法是非常常见的需求。尽管可以在methods中轻松实现这点,但更好的方式是:methods只有纯粹的数据逻辑,而不是去处理DOM事件细节。

为了解决这个问题,vue为v-on提供了事件修饰符。通过由点.表示的指令后缀来调用修饰符。

常见的事件修饰符如下:

按键修饰符

除了事件修饰符以外,在vue中还提供了有鼠标修饰符,键值修饰符,系统修饰符等功能。

表单修饰符

vue同样也为表单控件也提供了修饰符,常见的有.lazy、.number和.trim。

编码阶段

SEO优化

打包优化

用户体验

还可以使用缓存(客户端缓存、服务端缓存)优化、服务端开启gzip压缩等。

优化首屏加载可以从这几个方面开始:

key的作用主要是为了高效的更新虚拟DOM。另外vue中在使用相同标签名元素的过渡切换时,也会使用到key属性,其目的也是为了让vue可以区分它们,否则vue只会替换其内部属性而不会触发过渡效果。

其实不只是vue,react中在执行列表渲染时也会要求给每个组件添加上key这个属性。

要解释key的作用,不得不先介绍一下虚拟DOM的Diff算法了。

我们知道,vue和react都实现了一套虚拟DOM,使我们可以不直接操作DOM元素,只操作数据便可以重新渲染页面。而隐藏在背后的原理便是其高效的Diff算法。

vue和react的虚拟DOM的Diff算法大致相同,其核心有以下两点:

基于以上这两点,使得虚拟DOM的Diff算法的复杂度从O(n^3)降到了O(n)。

当页面的数据发生变化时,Diff算法只会比较同一层级的节点:

当某一层有很多相同的节点时,也就是列表节点时,Diff算法的更新过程默认情况下也是遵循以上原则。

比如一下这个情况:

我们希望可以在B和C之间加一个F,Diff算法默认执行起来是这样的:

即把C更新成F,D更新成C,E更新成D,最后再插入E

是不是很没有效率?

所以我们需要使用key来给每个节点做一个唯一标识,Diff算法就可以正确的识别此节点,找到正确的位置区插入新的节点。

ref的作用是被用来给元素或子组件注册引用信息。引用信息将会注册在父组件的$refs对象上。其特点是:

所以常见的使用场景有:

接口请求可以放在钩子函数created、beforeMount、mounted中进行调用,因为在这三个钩子函数中,data已经创建,可以将服务端端返回的数据进行赋值。

但是推荐在created钩子函数中调用异步请求,因为在created钩子函数中调用异步请求有以下优点:

另外作者也在找工作,欢迎公司有HC的同学内推,base地:深圳、广州或长沙。

THE END
1.算法到底是什么?(小白必读)那么,算法是什么呢?阅读完本节内容,相信大家能找到这个问题的答案。算法(Algorism)一词最初出现在 12 世纪,是用于表示十进制算术运算的规则。18 世纪,算法 Algorism 演变为 Algorithm,算法概念有了更广的含义。任何定义明确的计算步骤都可称为算法,或者说算法是合乎逻辑、简捷的一系列步骤。现在算法通常指可以https://baijiahao.baidu.com/s?id=1794500673477721607&wfr=spider&for=pc
2.什么是算法?什么是算法? 最近这两年,由于受到疫情影响,大家越来越难了:企业家、生意人、店主越来越难;外卖员、网约车司机越来越难;网红、主播、自媒体人越来越难。究其根本,大家都被算法困在了“算法”里。 什么事算法?现在几乎人人都离不开各大互联网平台,比如抖音、淘宝、美团、携程等。每个平台的运转都有自己的一套算https://www.jianshu.com/p/d5ff04cdf574
3.什么是算法?算法的概念什么是算法? 算法(Algorithm)是指解决特定问题的一系列明确、有限且可执行的步骤或规则。算法是计算机科学的核心概念之一,用于指导计算机完成各种任务,从简单的数学运算到复杂的数据处理和决策。 一、算法的基本定义 从广义上讲,算法可以定义为: 有穷性:一个算法必须在有限的步骤内完成。也就是说,算法不能无限循环,https://blog.csdn.net/weixin_48579910/article/details/141722210
4.算法是指什么?算法概述算法是指什么?算法概述 描述 一、算法概述 算法是指解题方案的准确而完整的描述,是一系列解决问题、高度符合逻辑性、可执行性的指令集合,代表运用系统方法描述解决问题的策略机制。算法能够对一定规范的输入在有限时间内运行得到输出。 算法中的指令描述的是计算过程,当其运行时能从初始状态和初始输入(初始输入可能为https://m.elecfans.com/article/2008707.html
5.什么是算法?什么是算法? 当人们提到“算法”一词,往往就会把它们当成专属于“人工智能”的范畴,很多专业的计算机人士也是,提起算法就头疼,不知道如何学习算法,慢慢的对算法就会失去兴趣,算法不仅仅是计算机行业特有的,在我们的生活中也处处存在着算法,算法是专注于解决问题的过程和方法。https://zhuanlan.zhihu.com/p/501462272
6.2017年网络信息安全试题附答案(2)D、HASH算法是一个从明文到密文的不可逆的映射 65、不是身份认证的方法___D___ A、口令 B、指纹识别 C、人脸识别 D、名字 66、家里可在ATM机上使用的银行卡为什么说是双重鉴定的形式? B A、它结合了你是什么和你知道什么 B、它结合了你知道什么和你有什么 Chttps://www.yjbys.com/edu/wangluojishu/303651_2.html
7.数学教师开学第一课教案(精选17篇)①数学是什么? ②怎样学数学? 2、全班交流。 【活动三:新学期的展望】 1、展望:在小组里说一说新学期努力的`目标,你准备怎样去实现它? 2、选出几位学生代表说说新学期的展望。 【活动四:新学期的新要求】 提出具体的新学期要求。 (1)实实在在做好预习作业。(尤其是对数学头疼的) https://www.ruiwen.com/jiaoan/5602830.html
8.RSA算法的优缺点分别是什么?具体介绍在这里RSA算法的优缺点分别是什么?具体介绍在这里 RSA算法实际上是一种密钥,它是基于数学理论的计算而产生的一种算法,RSA算法的起源可以说也是非常早的,但它一直沿用至今,在学习相应算法的时候,RSA算法也算是计算机领域学习者的必经之路,不过对于大多数的人来说,RSA算法就目前的应用领域而言其实是略微落后的,但是如果从https://cloud.tencent.com/developer/article/1841423
9.埋头刷了大半年Java面试题:如愿拿到众多大厂offer!分享还愿1. Java的内存模型以及GC算法 2. jvm性能调优都做了什么 3. 介绍JVM中7个区域,然后把每个区域可能造成内存的溢出的情况说明。 4. 介绍GC 和GC Root不正常引用 5. 自己从classload 加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。 https://maimai.cn/article/detail?fid=1735736133&efid=KbtUeCVp4epTWWihu6i76A
10.洪泰基金副总裁宋楠:AI创业要“少谈算法多接地气”投资者说钛媒体:算法、算力类的项目为什么会减少? 宋楠:像算法、算力上的技术优势反馈到客户那里,可能会有3%-5%准确率的差别,但这种差异很难去做一个定量的横向比较,实际上,AI 公司去拿单的一个核心因素是说商业的服务能力。 具体来说,比如和客户沟通,很多科学家背景的 AI 项目方会觉得,我的技术这么好你凭什么不用我https://www.tmtpost.com/3284389.html
11.《因数末尾有0的乘法》教案(通用14篇)(5)指一名学生将计算过程完整地说一遍。 (6)出示想一想:2500×3怎样写简便?这个问题引导学生讨论,并归纳简便算法。 让学生试做,指名板演:并要求说出计算过程,集体订正。 (7)及时练习: 课本第21页的做一做 做后订正提问:为什么第2、4两题积的末尾的0比第一个因数末尾的0多一个? https://www.jy135.com/jiaoan/1965005.html
12.《8和9加减法》说课稿(精选10篇)师:原来是一群可爱的大白鹅。这里也有数学问题呢?老师看谁的眼睛最亮,发现什么了?把你的发现和你的同桌说一说。 (指名两各学生汇报) 自己试着列出算式。、交流算法。 2、 5只大白鹅高兴的上岸了,它们看到了一群猴子,请你仔细观察,你会解决这个数学问题吗? https://www.yuwenmi.com/fanwen/shuokegao/2402556.html
13.PPT教学设计(精选15篇)2、评一评:图中的小朋友说得对吗?为什么? 3、学习“回音壁”:用赞美的眼光看别人,别人会更美。 用赞美的眼光看世界,世界会更美。 二、寻找班级小明星 (1)讨论:你觉得怎样的同学可以成为班级小明星? (2)说说我们班的.班级小明星。动手填写明星卡,并给同学发明星卡 https://www.oh100.com/peixun/office/477008.html
14.精选小学数学教案范文(通用14篇)2、在教学中引导学生独立探索计算方法,再交流比较不同的算法,得到简便的方法。并能规范书写、正确笔算。 教学重难点: 商中间、末尾有0的除法笔算过程方法,0的书写。 教学过程: 一、情景引入 1、(图片出示)同学们,你们观察一下这幅图,图上都有些什么? https://www.fwsir.com/jiaoan/html/jiaoan_20220221102931_1654433.html
15.5G人工智能到底多重要?大咖们这么说新闻频道360周鸿祎:人工智能是中国巨大的机会,可以换道超车 未来,物联网和物联网产生的大数据、大数据背后人工智能算法的演进,会彻底重塑每个人的生活和工作方式。人工智能与很多场景相结合,可以提高效率,甚至可以取代人的工作。某种程度来说,可能人工智能技术是中国弯道超车,甚至是换道超车的一个巨大机会。https://news.cctv.com/2018/11/09/ARTIEjCZmBKoDvMXUKqXSfEI181109.shtml