vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > Vue高频面试题

分析总结20道Vue高频面试题

作者:东方小月

这篇文章主要为大家介绍了分析总结20道Vue高频面试题示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

作为一个程序员如果你想要找到你心仪的工作,不可避免的就会问到很多八股文,虽然有的和工作没有半毛钱关系,但是你如果想要通过面试还必须得会。所以我最近开始总结一些面试题,一是为了加强自己的理解能够找到一份好的工作,二是为了尽可能的帮助更多的小伙伴能够快速掌握相关知识或者顺利通过面试🎉。

本篇文章介绍了一些vue的常见问题。我尽量将这些问题根据难易程度,相关联度进行排列使其更好的过度与理解。当然本篇文章不仅仅是八股文那么简单,工作中经常也会经常用到这些知识点。

vue生命周期

这个问题一般问的不多,但是如果问到了你就必须得答出来

回答

Vue2(选项式API)Vue3(setup)描述
beforeCreate-实例创建前
created-实例创建后
beforeMountonBeforeMountDOM挂载前调用
mountedonMountedDOM挂载完成调用
beforeUpdateonBeforeUpdate数据更新之前被调用
updatedonUpdated数据更新之后被调用
beforeDestroyonBeforeUnmount组件销毁前调用
destroyedonUnmounted组件销毁完成调用

vue父子组件生命周期

这个相对于上一个问题稍微复杂一点,可以试着理解记忆或者直接记住吧

渲染过程

父beforeCreate

父created

父beforeMount

子beforeCreate

子created

子beforeMount

子mounted

父mounted

更新过程

父beforeUpdate

子beforeUpdate

子updated

父updated

销毁过程

父beforeDestroy

子beforeDestroy

子destroyed

父destroyed

注意 如果子组件是异步组件的话它们的执行顺序会发生改变,会先执行完父组件的生命周期然后再执行子组件的生命周期

v-if和v-show

这个问题算是非常基本的题了,它也很好理解,面试一般会问这两个指令的区别是什么,以及在什么场景下分别用哪个指令合适 回答

v-for和v-if优先级

这个问题被问到的频率还是比较高的,虽然它在实际开发中并不会这么用。

回答

说一下computed和watch

computed和watch实际工作中用的比较多,所以问的也比较多,一般理解了基本都能回答上来

<template>
    <div>{{ addSum }}</div>
    <div>{{ addSum }}</div>
    <div>{{ addSum }}</div>
</template>
<script setup>
import { computed, ref, watch } from "vue";
const a = ref(1)
const b = ref(2)
let addSum = computed(() => {
    console.log('内部逻辑执行')
    return a.value + b.value
})
</script>

页面多次使用addSum,但是只会打印一次"内部逻辑执行"

vue-router

关于vue-router能问的问题非常多,比如它的实现原理,路由跳转,路由守卫等等,所以建议去系统的查看vue-router文档

问题1:vue-router是什么,描述一下它的原理?

Vue Router是Vue官方的路由管理器,有hash和history两种模式

hash模式是通过监听hashchange事件来实现更新页面部分内容的操作,url后面会带有#

history模式则是通过监听popstate事件来实现更新页面部分内容的操作原理和hash模式差不多,只不过url后面不会出现#会显得更加美观。同时会带来一个问题,因为没有#号,所以当用户刷新页面时会向服务器发请求导致请求资源为404,因此需要对nginx进行一个配置,需要把所有路由都重定向到根页面

问题2:路由跳转方式有哪些?

问题3:说一下路由守卫?

路由守卫分为全局路由守卫路由独享守卫组件路由守卫

beforeEnter,一般配置在路由配置文件中(router/index.js),对进入某个路由之前进行相关操作

接收to、from、next三个参数

beforeRouteEnter,进入该组件之前调用,无法获取到vue实例

beforeRouteUpdate,在当前路由改变,但是该组件被复用时调用

beforeRouteLeave, 在离开当前组件时调用

vue2和vue3区别

当面试问你会用vue3吗,如果你回答会用的话,那么大概率会问vue2和vue3有哪些区别,最近我去面试的时候百分之90都问了这个问题。

回答

vue插件使用

面试一般会问你如何写一个vue插件,所以没写过vue插件的最好去亲自体验一下

回答:

vue实例会有一个use函数,它接受的是一个带有install函数的对象和一个可选的选项对象,当我们使用 vue.use(plugin)或者app.use(plugin)会调用我们插件的install属性的函数,并且将当前组件的实例传进来.所以在插件中就可以对这个实例进行一些操作来实现我们插件的功能

vue插槽

插槽slot可以理解为占坑,当使用一个组件的时候,在组件标签里的对应的内容就会替换掉这个组件中的slot标签。

插槽分为默认插槽具名插槽作用域插槽

默认插槽 子组件中用slot标签来确定渲染位置,父组件使用它时直接在子组件的标签内写入内容即可

//子组件
<template>
    <slot />
</template>

//父组件
<Child>
  <div>默认插槽</div>  
</Child>

具名插槽

顾名思义就是具有名字的插槽,子组件中可以用name熟悉对slot命名,父组件在使用的时候通过 template中的v-slot:name或者#name来定义这个插槽中的内容

//子组件
<template>
  <slot name="content"></slot>
</template>

//父组件
<Child>
    <template v-slot:content>具名插槽内容</template>
</Child>

作用域插槽

子组件中的slot可以通过类似组件属性传递的方式将子组件的值传递给父组件中这个子组件的插槽内容中(子组件标签内),在父组件使用子组件的时候要用v-slot的值进行接收这些参数,默认插槽可以将其直接写在子组件标签上,具名插槽则写在template上。而传过来的值只能在子组件标签中或者template标签中使用。所以在父组件作用域中获取到了子组件作用域中的变量,可以认为作用域插槽延伸了子组件数据的作用范围,因此叫做作用域插槽

如果你想详细理解插槽的作用可以阅读这篇文章Vue3中插槽(slot)用法汇总 

组件通信

这里我大概归纳了一下vue2和vue3的传参方式

方式Vue2Vue3
父传子propsprops
子传父$emitemits
父传子$attrsattrs
子传父$listeners无(合并到 attrs方式)
父传子provide/injectprovide/inject
子组件访问父组件$parent
父组件访问子组件$children
父组件访问子组件$refexpose&ref
兄弟组件传值EventBusmitt

它们的具体用法可以参考我的这篇文章盘点Vue2和Vue3的10种组件通信方式(值得收藏) x和Pinia,前提你了解这两个状态管理器,因为你说了大概率下个问题就会问你Vuex和Pinia

vuex

面试问到这个问题的时候,不要上来就开始说什么state,mutation...。你要先阐述Vuex干嘛用的,什么时候需要用Vuex。

回答

pinia

这个现在问的好像不多,从我最近面试来看只有我提到了才会问一下,但是以后问的肯定会越来越多。关于pinia问的一般是它和Vuex的区别,确切的说应该是它和Vuex4之间的区别

回答

pinia其实就是Vuex5,它和Vuex的主要区别有以下几点

vue自定义指令

vue 官方提供了v-text、v-for、v-model、v-if 等常用的指令。除此之外vue 还允许开发者自定义指令。面试经常会问什么是自定义指令?你用自定义指令做过哪些功能?

回答1:什么是自定义指令?

<div v-example:foo.bar="baz">

它的binding会是这个对象

 {
    arg: 'foo',
    modifiers: { bar: true },
    value: /* `baz` 的值 */,
    oldValue: /* 上一次更新时 `baz` 的值 */ 
 }

回答2:你用自定义指令做过哪些功能?

keep-alive

官网描述

<KeepAlive> 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例。

回答

vue2混入-Mixin

vue3中已经没有Mixin这个概念了,所以未来被问到的几率会越来越小,但是目前被问到的频率还是很高的。一般会它的概念以及优缺点,有时还会问它与父组件的生命周期执行顺序

vue官网描述:

混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

回答 1.Mixin的作用将组件的公共逻辑提取出来,哪个组件需要用到时,直接将提取的这部分混入到组件内部即可 2. Mixin的生命周期会在父组件生命周期之前执行,如果Mixin中的属性或者方法与父组件冲突则会使用父组件中的 2. 优点:可以降低代码冗余提高逻辑复用性。 3. 缺点:命名容易冲突,不好追溯源,后期排查不方便

vue响应式原理

这道题问道的频率极高,就我经历的多场面试几乎都会问到,而且是面试到vue方面的开门题。

下面是我自己的理解回答,以vue2为例,大家可以借鉴参考

Object.defineProperty和proxy区别

一般问完响应式原理可能会问这两者的区别

回答

vue3内置组件

vue3新增了两个内置组件分别是TeleportSuspense

可以称之为传送门,作用将其插槽内容渲染到 DOM 中的另一个位置,接收两个参数to(要去的位置)和disabled(是否留在原位置)。接收比如下面代码

<teleport to="#popup"> 
    <video src="./my-movie.mp4"> 
</teleport>

video将会被传送到id为popup的元素下。

nextTick及原理

关于nextTick会问到它的用法,然后是它的原理,然后还可能问到JS的时间循环机制。

问题1:vue中的nextTick是干什么用的?

这个其实比较简单,用过都知道它是干嘛的,vue官方的解释是:

在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。

这是什么意思呢,其实vue中修改data不会立刻触发dom更新;而是把需要更新的Watcher加入到queueWatcher队列中,然后在合适的时机在nextTick中调用这些Watcher的更新函数进行dom更新,所以在data刚被修改的时候,我们是获取不到更新后的dom的,这时候便需要调用nextTick函数在它的回调函数中获取到变化后的dom

问题2:nextTick原理

问题3:js事件循环机制

不属于vue,后面文章再介绍

vue虚拟dom,diff算法

这题在工作中有用吗是🤨??答案是没有用,但是在面试中有用啊,所以我们要会回答😑

问题1:什么是虚拟dom?

简单来说就是一个描述dom结构的js对象

问题2:为什么要用虚拟dom?

问题3:说一下diff算法

diff算法的本质是找出两个对象之间的差异,目的是尽可能复用节点。在vue中是当状态发生改变,用来计算改变后的虚拟DOM与改变前的虚拟DOM之间的差异的算法。

具体实现不是几句话就能说清楚的,推荐一篇文章聊聊 Vue 的双端 diff 算法 )

结语

以上问题基本都是查阅部分资料结合自己的理解总结而来,所以难免会有一些错误以及不妥之处,如果你发现了还希望不吝指出,万分感谢。

更多关于Vue高频面试题的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文