前端面试分享:安安

1,你是怎么对axios进行二次封装的,有什么用?

a.添加请求拦截器

在请求发送前进行必要的操作处理,例如添加takan,cookie请求添加验证,设置请求头等,相当于是对每个接口里相同操作的一个封装;

b.添加响应拦截器

同理,响应拦截器也是如此功能,只是在请求得到响应之后,对响应体的一些处理,通常是数据统一处理等,也常来判断登录失效等。


2,什么是数组扁平化?

所谓的数组扁平化就是将多维数组转化为一维数组;

一般数组扁平化,数组中存储的多维数据都是数组不会是对象或者函数;

具体实现:最常用的方法就是使用toString()方法将数组中的每一个数据,转成一个字符串,使用逗号进行间隔,再使用字符串中的split方法,以逗号进行分割将字符串再转化为一维数组;


3.路由传参query与params区别

query类似 get,跳转之后在地址栏中显示拼接参数,类似?id=1;params类似 post,跳 转之后不在url中显示参数;相对于query比较安全;

注意点:(params在进行路由传参时,要在路由中配置占位。如果不在路由中配置占位,跳转过去以后刷新页面会数据丢失,query参数数据不会丢失);


4.在项目中有没有单独封装组件

有的,在项目的commen 文件下会存放项目公用组件(如:页面的头组件、页面底部组件等)项目里的 feature文件下则是放项目的功能组件(如:轮播图、分页器、上拉加载这些功能组件)把这些页面重复的部分,抽离出来进行单独的封装,有效的减少了代码量,提升了项目的开发效率。解决了传统项目中效率低、难维护、复用性低的等问题。


5.在项目中发送请求怎么携带token

答:当用户登陆的时候,后端会把用户的信息和token返回给我们的,我们进行存储token,把存储的token,放在请求拦截器中,这样所有的请求都可以直接通过请求拦截器将token传给服务器。


6.说一下项目的流程答:

aa.项目立项

bb.BA整理项目需求,定项目周期;3.需求评审(过项目需求)

cc.后端设计数据库,ui设计原型图5.ui评审

dd.前端静态页面开发(mock数据测试),后端做接口,测试做测试用例;

ee.前后端联调

ff.测试

gg.项目上线


7.get和post方式提交数据的区别是什么答:

1.GET提交的数据会放在?之后,以问号?分割URL和传输数据,参数之间以&相连;

(get因为浏览器对URL的长度有限制)

2.传输数据的大小不同,get方式传输的数据量较小,而post可以传输大量的数据。

3.安全性不同,get方式传输数据能够被别人轻易的看到数据内容,所以安全程度较低,而post则可以很好的隐藏。

4.在服务器上的作用不同,get是从服务器上获取数据,而post是向服务器上传送数据。


8.在实际开发中的应用

·在进行数据查询/获取的时候,用get的方式进行提交数据;

·当重要数据传输或者对数据进行增加、删除和修改的时候,用post的方式进行提交数据;


9.router和route之间的区别?

$router用来操作路由,$route用来获取路由信 息

$router是VueRouter的一个实例对象,他包含了所有的路由,包括路由的跳转方法,钩子函数,子对象(例如history)

$route是一个跳转的路由对象(路由信息对象),每一个路由都会有一个$route对象,是一个局部的对象。


10.url的解析过程?

用户输入 URL 地址。

对 URL 地址进行 DNS 域名解获得IP地址。

建立 TCP 连接(三次握手)。

浏览器向 web 服务器发送一个 HTTP 请求报文。

服务器返回 HTTP 响应报文给客户端。

关闭 TCP 连接(四次挥手)。

**DNS 解析就是从域名映射到IP地址的过程


11,hash和history的区别和优缺点?

前端面试分享:安安_第1张图片

12.对 $nextTick异步渲染对理解

Vue采用了数据驱动视图的思想,但是在一些情况下,仍然需要操作DOM。有时候,DOM1的数据发生了变化,而DOM2需要从DOM1中获取数据,那这时就会发现DOM2的视图并没有更新,这时就需要用到了 nextTick了;

作用:在下一次DOM更新结束后执行其指定的回调;(当数据更新后,要基于更新后的新

DOM进行某些操作时,要在nextTick指定的回调函数中执行)。如果不采用异步更新,在每次数据的更新后,都会对当前组件进行重新渲染。所以为了性能考虑,vue 会在本轮数据更新后,再去异步更新视图;


13.如何快速让一个盒子水平垂直居中

纯flex布局实现:给元素设置flex布局,添加flex的alignltems:center垂直居中justifycontent:center水平居中,实现居中效果;

flex 布局+外边距(margin)实现:给父级设置为 display: flex; 给子级添加 margin:auto; 就可以实现水平垂直居中显示;

绝对定位+外边距(margin)实现:绝对定位的元素将上下左右都设置为0,再设置margin:auto即可实现居中;

绝对定位+外边距(margin)+C3的转换transform 中的 translate 实现::绝对定位元 素,利用 margin 偏移外容器的50%,再利用translaate回补自身宽高的50%;


14.常见的HTTP请求有哪些?他们的区别是?答:

常见的有5种,分别是Get、Head,Post、 Put、Delete

1.Get:请求指定的页面信息,并返回实体主体,/用于获取/查询资源信息;

2.Head:类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。

3.Post:Post请求会向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。

4.Put:从客户端向服务器传送的数据取代指定文档的内容。

5.Delete:用于请求服务器删除所请求URL;

最常见的HTTP请求方法是Get和Post;


15.你上家公司项目是前后端分离的吗答:

对,做的是前后端分离的项目,但开始不是,开始前后端代码混在一起写的,后来重构成前后端分离的项目,方便前端和后端自己维护的代码;

注:所谓前后端分离就是前后端职责明晰:后端只提供数据接口地址返回json数据,前端用ajax请求json数据,页面的所有业务逻辑都是前端来写,让前端控制力更强,并且减轻后端逻辑处理压力。


16.项目中你是如何对移动端做适配的?

前端做适配没有最好的方法,只有适合的方法,目前前端主要做适配的方法有:百分比,em,rem,媒体查询(即mediaquery)flex布局即弹性盒),vw.vh等目前我在项目中用的多的是rem,flex布局,有时会用到媒体查询,在做pc响应式布局时用主要是用了一个手淘的js库flexible.js在页面变化时,检测页面宽度,除以10份,动态的赋值给font-size.属性.而页面的布局我是通过rem来进行布局的,从而达到移动端适配;


17.Element-ul的form表单验证你是怎么使用的

首先是在form表单配置rules校验规则,可以在组件data中自定义(或者统一封装到一个JS文件中),使用required:true,来设置form表单为必填项,message设置提示信息,通过trigger定义触发校验方式;当全部表单都符合校验规则,在点击确定的时候调用validate进行最终的表单校验。validate参数为一个回调函 数,回调函数有一个config参数(是否校验成 功)我们可以对config进行判断,成功就携带form表单的信息提交后台


18.项目中的商品详情页你是怎么实现的

当用户点击商品名字或者图片的时候,就进行this.$router.push进行路由跳转并传递商品的d到详情页,再通过后台提供的相关详情接口,把id作为参数,在详情组件的mounted钩子函数中派发action调用Vuex中的请求函数,获取到商品的详细数据存储Vuex中,通过getters配置对象,对数据进行简化,通过map getters映射给组件,使用插值语法或者v-for进行数据炫染;


19.Vue 的父组件和子组件生命周期钩子函数执行顺序

Vue 的父组件和子组件生命周期钩子函数执行顺序可以归类为以下 4 部分:

加载渲染过程

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

子组件更新过程

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

父组件更新过程

父 beforeUpdate -> 父 updated

销毁过程

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


20.为什么说刷新页面vuex的数据会丢失

页面刷新的时候vuex里的数据会重新初始化,导致数据丢失。

解决的思路:

办法一:将vuex中的数据直接保存到浏览器缓存中(sessionStorage、localStorage、cookie)

办法二:在页面刷新的时候再次请求远程数据,使之动态更新vuex数据

办法三:在父页面向后台请求远程数据,并且在页面刷新前将vuex的数据先保存至sessionStorage ( 以防请求数据量过大页面加载时拿不到返回的数据)

分析:

办法一的缺点是不安全,不适用大数据量的存储;

办法二适用于少量的数据,并且不会出现网络延迟;

办法三是要讲的重点,办法二和办法一一起使用


21.什么是虚拟dom和diff算法

简单的说:虚拟DOM就是用来模拟DOM结构的一个js对象

虚拟DOM的工作流程:

首先:用JS以对象的形式模拟DOM结构,表示页面上的某个节点

其次:通过patch函数,将虚拟DOM节点塞入到空的容器中

最后:通过核心计算渲染时指挥修改改变过的节点,没有变化的节点不需要再次渲染

使用虚拟DOM的好处在于,新虚拟DOM和旧虚拟DOM的比较,计算出来需要更新的视图,再 操作DOM,也就是使用虚拟DOM来表示真实的DOM,目的计算出最小的变化,根据最小变化来更 新真实的DOM结构。

虚拟DOM核心diff算法:

diff算法的概念:diff 算法是一种通过同层的树节点进行比较的高效算法,避免了对树进行逐层搜索遍 历

流程:

1-先遍历一次老的虚拟DOM

2-再遍历一次新的虚拟DOM

3-根据改变/新增,对真实DOM重新进行排序

弊端:如果有100个DOM节点的话就要计算100^3次,如果节点更多的话会造成大量的计算,这样 的方式是不可取的

所以,vue中对diff算法进行了优化

1-只会比较同一层级,不会跨级比较

2-比较标签名:标签名不同时,直接删除,不继续深入比较

3-标签名相同时:判断key是否相同,这就是为什么在vue中v-for循环 一定要绑定key的原 因,当key相同时,就会默认是相同节点,不进行深入比较

优点:通过优化后,100个DOM节点只会计算100次,极大的节约了时间。


22.em,rem区别:

在css中,用的最多的就是px,em,rem三个长度单位,这三个单位的区别就是:

px是固定的单位长度,一旦设置了就无法随页面的大小而适应改变。

em是相对长度单位,比px更具灵活性,em的长度是相对于父元素

rem的长度是相对于根元素,也就是html的字体大小

你可能感兴趣的:(前端)