前端开发面试笔试题2023 收藏共勉(不断更新)
1.vue中的v-if和v-show是做什么用的,两者区别是什么?
答:两者在使用时皆为切换的作用,但两者不同的地方在于消耗上,v-if在每次切换时消耗较大,而v-show仅在初始化时消耗较大,所以两者要根据场景不同来选择。
2.如何让css只在当前组件中起作用?
答:在当前的style里后面加上scoped,例 style scoped
3.如何实现双向绑定以及双向绑定的原理?
答:v-model是实现双向绑定的语法糖,常用于表单与组件之间的数据双向绑定。
原理:分两步骤 v-bind绑定一个value属性 v-on指令给当前元素绑定input事件 可看出v-model绑定在表单上时,v-model其实就是v-bind绑定value和v-on监听input事件的结合体。
4.vue-loader是什么?使用它的用途有哪些?
答:解析.vue文件的一个加载器,跟template/js/style转换成js模块。
用途:js可以写es6、style样式可以scss或less、template可以加jade等。
5.NextTick是做什么的?
答:$nextTick是在下次DOM更新循环结束后之执行迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的DOM。
场景:需要在视图更新之后,基于新的视图进行操作。
6.keep-alive是什么?
答:keep-alive是vue里内置的一个组件,在前端需要保留当前页面的状态,也就是缓存。对应两个钩子函数 activated 和 deactivated ,当组件被激活时,触发钩子函数 activated,当组件被移除时,触发钩子函数 deactivated。
7.key的作用是什么?
答:key是一个唯一标识符,主要的作用是为了高效的更新虚拟dom。切记key值不可重复!!!
8.watch和computed的区别
答:两者皆为数据监听,但区别在于watch比较消耗性能,与vue性能优化背道而驰,尽量不用。computed是当数据发生改变的时候进行相应的数据变化,由老数据引起新数据的变化,会利用缓存机制对数据进行缓存,只有当依赖书据变化的时候才会进行相应变化。
9.vue组件之间是如何进行传值的?
答:
父传子
<!--父组件-->
<Header :msg='msg'></Header>
<!--子组件-->
props:['msg']
props:{
msg: 数据类型
}
子传父
<!--子组件-->
this.$emit("自定义事件名称",要传的数据);
<!--父组件-->
<Header @childInput='getVal'></Header>
methods:{
getVal(msg){
//msg就是子组件传过来的数据
}
}
兄弟组件传值
<!--兄弟组件传值-->
通过一个中转bus
A传值:
import bus from '@/common/bus'
bus.$emit("toFooter",this.msg);
B接收:
import bus from '@/common/bus'
bus.$on('toFooter',(data)=>{
//data就是this.msg
})
10.vue项目中各个文件夹的作用
答:
main.js 入口文件
router.js 前端路由配置文件
store.js vuex的配置文件
app.vue 根组件
views 路由组件
components 在路由组件中引入的其他组件
assets 在vue文件中使用相对路径引入的资源文件
11.axios是什么?怎么使用?描述使用它实现登录功能的流程?
答:请求后台资源的模块。npm install axios -S装好,
然后发送的是跨域,需在配置文件中config/index.js进行设置。
后台如果是Tp5则定义一个资源路由。js中使用import进来,
然后.get或.post。返回在.then函数中如果成功,
失败则是在.catch函数中
12.vue跨域请求接口代理方式
答:在config/index.js配置一下
然后重启服务
axios.get(“/api/xxx”)就可以了
13.vue的生命周期4个阶段 8个钩子函数
答:vue生命周期分为四个阶段
第一阶段(创建阶段):beforeCreate,created
第二阶段(挂载阶段):beforeMount(render),mounted
第三阶段(更新阶段):beforeUpdate,updated
第四阶段(销毁阶段):beforeDestroy,destroyed
14.详细说一下你对vue生命周期的理解?
答:共有八个阶段 创建前后 挂载前后 更新前后 销毁前后
创建前/后:在创建之前,vue实例的el和data都为undefined,没有初始化。在创建阶段,data数据有了但是el还没有。
挂载前/后:在挂载前,vue实例的el和data都初始化了,但还是挂载前的虚拟dom节点,data.message还没替换。在挂载阶段,实例挂载完成,data.message成功渲染
更新前/后:当data发生变化时,会触发这两个方法
销毁/前后:在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在。
15.单页面应用的优缺点有哪些?
答:
优点:
1.用户体验好,速度快,内容改变无需刷新整个页面,对服务器压力比较小
2.前后端分离式开发
3.页面效果比较炫酷(这一点比较会让甲方爸爸满意)
缺点:
1.不利于seo
2.导航不可用,需要自行实现前进和后退
3.初次加载消耗大,慢
4.页面相对复杂
16.路由的跳转方式
答:
< router-link to=“home”> router-link标签会渲染为< a >标签,在tamplate中跳转都是这种;
另一种变成是导航,也就是通过js跳转,比如router.push(“home”)
ps:
项目中个人用到最多的式js跳转,但是要注意在跳转路由时如果需要传参的话尽量不要将传的参拼到url后面!!
17.$router 和 $route的区别
答:
router是开始跳路由用的
route是接参的时候用的
18.vue-router有哪几种导航钩子?
答:
1.全局钩子
2.单个路由独享
3.组件
19.vuex有了解吗?
答:vuex是一种状态管理,集中存储所有组件的状态,可以当作是一个全局仓库
vuex有五种属性:state getter mutation action module
20.MVVM框架是什么?
答: M代表model数据模型,V代表view视图,VM代表将数据模型和视图相结合
21.接口请求一般放在哪个生命周期中?
答:接口请求一般放在mounted中,但需要注意的是服务端渲染时不支持mounted,需要放在created中
22.简述diff算法过程
答:执行diff算法就是调用patch函数,比较新旧节点,然后不断给真实的DOM打补丁。patch函数接收两种参数,vnode和oldVnode,两个参数分别代表了新节点和旧节点。此时用到了sameVnode(oldVnode, vnode),如果返回的是true,那么就执行patchVnode,如果返回的是false,那么就将vnode替换oldVnode,将新节点替换给旧节点。
23.vue为何是异步渲染?
答:如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染,考虑到性能问题,vue会在本轮数据更新后再去异步更新视图。
24.vue 的一些指令用法
答:
v-html html
v-text 元素里显示内容
v-bind:data 绑定动态数据data
v-on:click 绑定事件@click
v-for 渲染列表,按照数据循环生成所在标签的结构
v-if和v-show 用于隐藏和显示
v-model 双向数据绑定 用于表单
25.vue页面级组件之间传值?
答:
1.使用vue-router进行页面跳转和传参
2.使用本地localstorge
3.使用vuex数据管理传值
26.vue中哪些数组方法可以直接对数组修改实现视图更新
答:
push() 在集合中添加元素,并返回新的长度
pop() 从集合中把最后一个元素删除,并返回这个元素的值
shift() 从集合中把第一个元素删除,并返回这个元素的值
unshift() 在集合开头添加一个或更多元素,并返回新的长度
splice() 通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容
sort() 用来排序,默认是按照每个字符的unicode位进行排序
reverse() 倒序排列原数组
27.为什么做首屏优化?如何做?
答:首屏时间的快与慢,直接影响到了用户对网站的认知度。所以首屏时间的长短对于用户的滞留时间的长短、用户转化率都尤为重要。
css模块化加载,对应模块下的css交给js或jsonp请求返回
js懒执行,有交互才执行
图片在其他屏(非首屏)都采用懒加载的模式,这样既能节省流量,也能减少请求数或延迟请求数。
服务器方面:
(1)少量静态文件的域名,图片与iconfont均是放在同一个域下,减少DNS的解析事件,最好做到域名收敛。
(2)模块化接口的支持。
(3)首屏内容最好做到静态缓存
(4)对于vue和react做ssr
28.vue常用的修饰符
答:
.stop —— 调用event.stopPropagation(),禁止事件冒泡
.prevent —— 调用 event.preventDefault(),阻止事件默认行为
.capture —— 添加事件侦听器时使用capture模式
.self —— 只当事件是从侦听器绑定的元素本身触发时才触发回调
.native —— 监听组件根元素的原生事件
.once —— 只触发一次回调
.number ——输入字符串转为数字
.trim —— 过滤空格
29.v-on可以监听多个方法吗?
答:v-on可以监听多个方法,但是同一种事件类型的方法,vue-cli工程会报错。
30.页面闪动问题如何解决
答:使用v-cloak
31.描述组件渲染和更新的过程
答:
vue 组件初次渲染过程:
解析模板为 render 函数
触发响应式,监听 data 属性的 getter 和 setter
执行 render 函数, 生成 vnode,patch(elem,vnode)
vue 组件更新过程:
修改 data, 触发 setter (此前在getter中已被监听)
重新执行 render 函数,生成 newVnode,patch(vnode, newVnode)
32.什么是Mixin?
答:将组件的公共逻辑或者配置提取出来,哪个组件需要用到时,直接将提取的这部分混入到组件内部即可。这样既可以减少代码冗余度,也可以让后期维护起来更加容易。
这里需要注意的是:提取的是逻辑或配置,而不是HTML代码和CSS代码。其实大家也可以换一种想法,mixin就是组件中的组件,Vue组件化让我们的代码复用性更高,那么组件与组件之间还有重复部分,我们使用Mixin在抽离一遍。
33.Mixin和Vuex的区别?
答:
Vuex公共状态管理,如果在一个组件中更改了Vuex中的某个数据,那么其它所有引用了Vuex中该数据的组件也会跟着变化。
Mixin中的数据和方法都是独立的,组件之间使用后是互相不影响的。