前端面试题大合集6----框架篇(Vue)

一、简述Vue中key的作用及原理

key是虚拟Dom对象的标识,当数据发生变化时,Vue会根据【新数据】生成【新的虚拟Dom】,随后Vue进行【新虚拟Dom】与【旧虚拟Dom】的差异比较。

原理(比较规则):

  1. 旧虚拟Dom中找到了与新虚拟Dom相同的key:
    • 若虚拟Dom中内容没变,直接使用之前的Dom;
    • 若虚拟Dom中内容变了,则生成新的真实Dom,随后替换掉页面中之前的真实Dom;
  2. 创建新的真实Dom,随后渲染到页面。

index作为key 可能会引发的问题:

  1. 若对数据进行逆序添加,逆序删除等破坏顺序操作:会产生没有必要的真实Dom更新===》界面效果没问题,但效率低;
  2. 如果结构中还包含输入类的Dom:会产生错误Dom更新===》界面有问题。
二、简述对于Vue的diff算法的理解
  • diff算法的作用:用来修改dom的一小段,不会引起dom树的重绘;
  • diff算法的实现原理:将virtual dom的某个节点数据改变后生成的新的vNode与旧节点进行比较,并替换为新的节点,具体过程就是调用patch方法,比较新旧节点,一边比较一边给真实的dom打补丁进行替换。
  • 具体过程详解:
  1. 在采用diff算法进行新旧节点进行比较的时候,比较是在同级进行比较的,不会进行跨级比较;
  2. 当数据发生改变的时候,set方法会调用dep.notify通知所有的订阅者watcher,订阅者会调用patch函数给响应的dom进行打补丁,从而更新真实的视图;
  3. patch函数接受两个参数,第一个是旧节点,第二个是新节点,首先判断两个节点是否值得比较,值得比较则执行patchVnode函数,不值得比较则直接将旧节点替换为新节点。如果两个节点一样就直接检查对应的子节点,如果子节点不一样就说明整个子节点全部改变,不再往下对比,直接进行新旧节点的整体替换。
  4. patchVnode函数:找到真实的dom元素;判断新旧节点是否指向同一个对象,如果是就直接返回;如果新旧节点都有文本节点,那么直接将新的文本节点赋值给dom元素,并且更新旧的节点为新的节点;如果旧节点有子节点而新节点没有,则直接删除dom元素中的子节点;
三、简述Vue的实现原理

vue.js是采用数据劫持结合发布者-订阅者模式的方法,通过Object.defineProperty()来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

具体步骤:

第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上setter和getter;这样子的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化;

第二步:compile解析模版指令,将模版中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦有数据变动,收到通知,更新视图;

第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:

  1. 在自身实例化时往属性订阅器里面添加自己;
  2. 自身必须有一个update方法;
  3. 待属性变动dep.notice通知时,能调用自身的update方法,并触发Compile中绑定的回调,则功成身退。

第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模版指令,最终利用Watcher搭建起Observer和Compile之间的通信桥梁,达到数据变化---->视图更新;视图交互变化---->数据model变更,这样子的双向绑定效果。

四、简述Vue2和Vue3的区别

1、双向数据绑定原理不同

vue2:利用ES5的一个API:Object.defineProperty()对数据进行劫持,结合发布订阅模式的方式来实现的;

vue3:使用ES6的Proxy对数据代理,去实现双向数据绑定的。

相比vue2.x,使用proxy的优势如下:

  • defineProperty只能监听某个属性,不能对全局对象监听;
  • 可以省去for in,闭包等内容来提升效率(直接绑定整个对象即可);
  • 可以监听数组,不用再去单独的对数组做特异性操作,vue3.x可以检测到内部数据的变化。

2、是否支持碎片

vue2:不支持碎片;

vue3:支持碎片(Fragments),就是说可以拥有多个根节点。

3、API类型不同

vue2:使用选项类型api,此种方式在代码里分割了不同的属性:data、computed、methods等;

vue3:使用组合式api,新的合成型api能让我们使用方法来分割,相比于旧的api使用属性来分组,这样子代码会更加简便和整洁。

4、定义数据变量和方法不同

vue2:把数据放在data中,在vue2中定义数据变量是data(){},创建方法要在methods:{}中;

vue3:需要使用一个新的setup()方法,此方法在组件初始化构造的时候触发。使用一下三个步骤来建立反应性数据:

  1. 从vue引入reactive;
  2. 使用reactive()方法来声明数据作为响应性数据;
  3. 使用setup()方法来返回我们的响应性数据,从而template可以获取这些响应性数据。

5、生命周期钩子函数不同

vue2生命周期:

beforeCreate 组件创建之前
created 组件创建之后
beforeMount 组价挂载到页面之前执行
mounted 组件挂载到页面之后执行
beforeUpdate 组件更新之前
updated 组件更新之后

vue3生命周期:

setup 开始创建组件前
onBeforeMount 组价挂载到页面之前执行
onMounted 组件挂载到页面之后执行
onBeforeUpdate 组件更新之前
onUpdated 组件更新之后

而且vue3.x生命周期需要在调用前先进行引入。除了这些钩子函数外,vue3.x还增加了onRenderTracked 和onRenderTriggered函数。

6、父子传参数不同

vue2:父传子,用props,子传父,用时间Emitting Events。在vue2中,会调用this.$emit,然后传入事件名和对象;

vue3:父传子,用props,子传父,用时间Emitting Events。在vue3中的setup()中的第二个参数content对象中就有emit,那么我们只要在setup()接收第二个参数,使用分解对象法,取出emit,就可以在setup方法中随意使用了。

7、指令与插槽不同

vue2:使用slot,可以直接使用slot;v-for与v-if在vue2中优先级高的是v-for指令,而且不建议一起使用;

vue3:必须使用v-slot的形式;vue3中v-for与v-if,只会把当前v-if当作v-for中的一个判断语句,不会互相冲突;vue3中移除keyCode作为v-on修饰符,当然也不支持config.keyCodes;vue3中移除v-on.native修饰符;vue3中移除过滤器filter。

8、main.js文件不同

vue2:可以使用prototype(原型)的形式去进行操作,引入的是构造函数;

vue3:需要使用结构的形式去操作,引入的是工厂函数;vue3中的app组件中可以没有跟标签。

五、简述Vue中watch用法

在vue中使用watch来监听数据的变化;

  1. 监听的数据后面可以写成对象形式,包含handle方法,immediate和deep;
  2. immediate标识在watch中首次绑定的时候,是否执行handler,值为true,则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据变化的时候才执行handle;
  3. 当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的变化,只有data中的数据才能够监听到变化,此时就需要deep属性对这个对象进行深度监听。

可以看一下示例代码:

watch: {name: {handler(newName, oldName) {},deep: true,immediate: true}}
六、简述为什么Vue采用异步渲染

vue是组件级更新,当前组件里的数据变了,它就会去更新这个组件。当数据更改一次组件就重新渲染一次,性能不高,为了防止数据一更新就更新组件,所以做了个异步更新渲染(核心的方法就是nextTick)。

源码实现原理:

当数据变化后会调用notify方法,将watcher遍历,调用update方法通知watcher进行更新,这时候watcher并不会立即去执行,在update中会调用queueWatcher方法将watcher放到一个队列里,在queue Watcher会根据watcher的进行去冲,多个属性依赖一个watcher,如果队列中没有该watcher就会将该watcher添加到队列中,然后通过nextTick异步执行flushSchedulerQueue方法刷新watcher队列。flushSchedulerQueue方法中开始会触发一个before方法,其实就是before Update,然后watcher.run()才开始真正执行watcher,执行完页面就渲染完成啦,更新完成后会调用update钩子。

七、请解释Vue的父子组件生命周期钩子函数执行顺序
  • 加载渲染过程

父 beforeCreate -> 父 created -> 父 beforeMount -> 子 beforeCreate -> 子 created
-> 子 beforeMount -> 子 mounted -> 父 mounted

  • 子组件更新过程

父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated

  • 父组件更新过程

父 beforeUpdate -> 父 updated

  • 销毁过程

父 beforeDestroy -> 子 beforeDestroy -> 子 destroyed -> 父 destroyed

总结: 父组件先开始 子组件先结束

八、SPA首屏加载速度慢怎么解决?

1、请求优化:

CDN将第三方库放到CDN上,能否大幅度减少生产环境中的项目体积,另外CDN能够实时的根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。

2、缓存:

将长时间不会改变的第三方库或者静态资源设置为强缓存,将max-age设置为一个非常长的时间,再将访问路径加上哈希值,哈希值变化了以后保证获取到最新资源,好的缓存策略有助于减轻服务器的压力,并且显著的提升用户体验。

3、gzip:

开启gzip压缩,能够有效的压缩传输资源的大小。

4、http2:

如果系统首屏同一时间需要加载的静态资源非常多,但是浏览器对同域名的tcp连接数量是有限制的(chrome上限是6个),超过规定数量的tcp连接,则必须要等到之前的请求收到响应后才能继续发送;而http2则可以在多个tcp连接中并发多个请求没有限制,在一些网络较差的环境开启http2性能提升尤为明显。

5、懒加载

当url匹配到相应的路径时,通过import动态加载页面组件,这样首屏的代码量会大幅减少,webpack会把动态加载的页面组件分离成单独的一个chunk.js文件

6、预渲染

由于浏览器在渲染出页面前,需要先加载和解析相应的html、css和js文件,为此会有一段白屏的时间,可以添加loading,或者骨架屏幕尽可能的减少白屏对用户的影响。

7、合理使用第三方库

对于一些第三方ui框架、类库,尽量使用按需加载,减少打包体积

8、使用可视化工具分析打包后的模块体积

webpack-bundle-analyzer这个插件在每次打包后能够更加直观的分析打包后模块的体积,再对其中比较大的模块进行优化

9、封装

构建良好的项目架构,按照项目需求就全局组件、插件、过滤器、指令、utils等做一些公共封装,可以有效的减少我们的代码量,而且更容易维护资源优化

10、图片懒加载和压缩图片,压缩图片可以使用image-webpack-loader,在用户肉眼分辨不清的情况下,一定程度上压缩图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/17501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄

SqlServer 2016 2017 2019安装失败-无法找到数据库引擎启动句柄 出现以上问题的原因是因为系统账户无法操作数据库引擎服务。需要调整权限。 按照以下步骤解决,成功完成安装,已亲测: 1、如果您已经安装了相同版本的SQL Server,…

数据结构算法题day03

数据结构算法题day03 题目 题目 2.设计一个高效算法&#xff0c;将顺序表L的所有元素逆置&#xff0c;要求算法的空间复杂度为O(1)算法思想&#xff1a; 1、常规的解法&#xff1a; Void reverse (sqlist &L){Elemtype temp; //辅助变量for(i 0,i < L.length; i){temp…

Java中的JDBC是什么?如何使用它连接数据库?

一、技术难点 JDBC&#xff08;Java Database Connectivity&#xff09;是Java语言与数据库之间进行交互的API。它允许Java程序通过SQL&#xff08;结构化查询语言&#xff09;来执行各种数据库操作&#xff0c;如查询、更新、删除等。然而&#xff0c;使用JDBC也存在一些技术…

基于NAMUR开放式架构(NOA)的工业设备数据采集方案

一 NAMUR开放式架构 传统自动化金字塔结构的优越性在过去许多年里已被证明。然而&#xff0c;传统的自动化金字塔在获取和利用对物联网和工业4.0有价值的数据方面却存在一定挑战。这是因为传统系统通常是封闭的&#xff0c;数据访问受到限制&#xff0c;难以集成到新的数字化解…

剖析【C++】——类与对象(中)——小白篇—超详解

目录 1.类的6个默认成员函数&#xff1a; 1. 默认构造函数&#xff08;Default Constructor&#xff09; 2. 析构函数&#xff08;Destructor&#xff09; 3. 拷贝构造函数&#xff08;Copy Constructor&#xff09; 4. 拷贝赋值运算符&#xff08;Copy Assignment Operato…

Docker部署后的中文乱码问题

本地和服务器上面生成图片文字多没有乱码&#xff0c;但是服务部署到docker上面就开始出现乱码。排查了一下发现是docker上缺少相应的中文字体&#xff0c;添加字体即可解决。 1.在网站上找到相关资源并下载字体-字体下载-字体下载大全-字体免费下载|字体下载 2.上传到服务器 …

8D和FMEA的关系是什么?——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 在质量管理领域中&#xff0c;8D和FMEA是两个非常重要的工具。它们各自有着独特的作用&#xff0c;但同时又存在着紧密的联系。本文旨在深入探讨8D和FMEA之间的关系&#xff0c;以及它们如何协同工作以提高产品质量和客户满意度。 8D&#x…

python中使用缓存技术

functools.cache 是 Python 3.9 中引入的一个装饰器&#xff0c;用于缓存函数的返回值&#xff0c;以便在相同的参数输入下&#xff0c;可以直接返回缓存的结果&#xff0c;而不必重新计算。这对于那些在相同输入下计算结果相同的函数来说非常有用。 使用 functools.cache 装饰…

电子商务商城B2B2C:JAVA实现的商家间直播带货商城系统概览

电子商务商城&#xff1a;构建全行业全渠道的一体化SaaS解决方案 在数字化转型的浪潮中&#xff0c;企业对于高效、集成的管理系统的需求日益增长。电子商务商城的SaaS云平台应运而生&#xff0c;它旨在为各行各业提供全面的一体化解决方案&#xff0c;无论是门店经营的区域化…

UE5 Cesium2 最新使用地理配准子关卡构造全球场景

参考官方最新教程&#xff1a;Building Global Scenes with Georeferenced Sublevels – Cesium 创建持久关卡&#xff08;主关卡&#xff09; 这里一般包含DynamicPawn、CesiumSunSky 和 Cesium World Terrain 全球场景通用的对象。子关卡的创立&#xff0c;官方教程分为了两…

低代码与人工智能:革新智能客服系统的高效之道

引言 在当前数字化和智能化浪潮的推动下&#xff0c;企业对智能客服系统的需求呈现显著增长。随着客户期望的不断提升&#xff0c;企业需要更加高效、智能和个性化的客户服务解决方案。传统的人工客服方式不仅成本高昂&#xff0c;且难以满足大规模、多样化的客户需求。而智能客…

安装mysql的MGR集群

说明 1、 mysql数据库主从宕机,会影响到正常业务访问,并且要手动进行切换。 2、 MHA高可用搭建复杂,代码已停止更新。 3、 MGR集群搭建方便, master故障会自动进行切换,不影响业务正常访问。 一、环境准备 1、主机说明 IP地址主机名端口操作系统数据库版本172.16.1.20db0…

如何远程访问Redis?

远程访问Redis是一种常见的需求&#xff0c;特别是在分布式系统或跨地域网络中。通过远程访问&#xff0c;我们可以轻松地对远程的Redis数据库进行操作和管理。 天联保障数据安全 对于远程访问Redis的安全性问题&#xff0c;我们可以借助天联来保障数据的安全。天联是一种基于…

免费无限换脸,火了,图片/视频/直播都行!

最强换脸AI工具Facefusion软件在近期更新到了2.6.0版本&#xff0c;带来了一系列的更新和改进&#xff0c;今天为大家分享一下最新的整合包。 Facefusion2.6.0版本介绍 FaceFusion不仅仅是一款换脸软件&#xff0c;它更是一个多功能的数字人和实时直播助手&#xff0c;真正开启…

python Windows电脑设置定时启动程序,定时运行代码

Windows设置定时 一&#xff0c;新建文件txt, .txt改为.bat 路径填exe的路径D:\test\main.py 如下是启动exe,如果运行python代码则写入如&#xff1a;python D:\test\main.py 二&#xff0c;搜索计算机管理 三&#xff0c;点击创建基本任务 填写任意名称 选择什么时候开始…

Element-Plus中表格及分页功能

导入Element-Plus 具体步骤如下&#xff1a;&#xff08;内容参照官网&#xff1a;安装 | Element Plus&#xff09; # 选择一个你喜欢的包管理器# NPM $ npm install element-plus --save# Yarn $ yarn add element-plus# pnpm $ pnpm install element-plus 安装完成后即可…

实现按块复制元素的进阶技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、按块复制元素的重要性 二、使用LED模块创建数组并复制 三、实现按块复制的具体步骤 四…

群晖NAS使用Docker部署WPS Office结 合内网穿透实现远程编辑本地文档

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

基于微信小程序+ JAVA后端实现的【微信小程序跑腿平台】设计与实现 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 《微信小程序跑腿平台的设计与实现》 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java, SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信小程序, HTML…&#xff08;其它相关技术&#xff09; …

工作软件新宠儿

想要让你的工作效率飞起来吗&#xff1f;&#x1f440; 是时候告别那些大众化的工作软件啦&#xff01;今天&#xff0c;我要给大家种草几款不常见的但超级实用的工作软件&#x1f331;&#xff0c;保证让你事半功倍哦&#xff01;&#x1f31f; 1️⃣ 亿可达 它是一款自动化…