『面试宝典』——99道Vue高频面试题汇总(二)

1,539 阅读7分钟

又到了金三银四跳槽黄金时期,are you ready 😊😊? 想必又有大批同行要跳槽~涨薪💲💲💲... 所以小编给大家总结了一份Vue面试礼包💟,这篇文章小编是自己经过查阅资料、参考官方文档以及自己动手实践总结的。如果发现有问题,欢迎到评论区交流😁😁

小编希望读者看到题目时,自己先思考一下,想想你的答案是啥?然后再查看小编给提供的答案。

话不多说,直接上题 🏆

二、生命周期

1. 什么是vue的生命周期?

展开查看

Vue实例创建销毁的过程,就是生命周期。 也就是从开始创建、初始化数据、编译模板、挂在DOM—>渲染、 更新->渲染、卸载一系列等过程,我们称之为Vue的生命周期。

2. 说一下Vue生命周期的钩子函数

展开查看

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

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

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

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

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

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

beforeDestroy: 发生在销毁实例之前,在当前阶段实例完全可以使用,我们可以在此阶段清除定时器等操作。

destorted: 发生在实例销毁之后,这个时候只剩下一个空的DOM空壳。组件已经被拆解,数据绑定被卸除,监听被移除,子实例也统统被销毁。

3. Vue生命周期的作用是什么?

展开查看

它的生命周期中有多个事件钩子,让我们在控制整个Vue实例的过程时更容易形成更好的逻辑

4. Vue生命周期总共有几个阶段?

展开查看

它总共可以分为8个阶段: 创建前/后载入前/后更新前/后销毁前/后

5. 第一次页面加载会触发那几个钩子?

展开查看

第一次加载时会触发beforeCreatecreatedbeforeMountmounted

6. DOM渲染在哪个周期中就已经完成了?

展开查看

DOM渲染在mounted中就已经完成了。

7. 生命周期钩子的一些使用方法:

展开查看

beforeCreate: 可以加载loading事件,在加载实例时触发;

created:初始化完成时的时间写在这里,如在结束loading事件,异步请求也事宜在这里调用;

mounted: 挂在元素,获取DOM节点;

updated: 如果对数据统一处理,这里写相应的函数

beforeDestroy: 可以一个确认停止事件的确认框

nextTick: 更新数据后立即操作DOM

8. 接口请求一般放在哪个生命周期中?

展开查看

接口请求一般放在mounted中,但需要注意的是服务端渲染时不支持mounted,需要放到credted中。

9. Vue中组件生命周期调用顺序说一下

展开查看

组件的调用顺序都是先父后子, 渲染完成的顺序时先子后父;

组件的销毁操作时先父后子, 销毁完成的顺序时先子后父;

加载渲染过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount- >子mounted->父mounted

子组件更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated

父组件更新过程 父 beforeUpdate -> 父 updated

销毁过程 父beforeDestroy->子beforeDestroy->子destroyed->父destroyed

10. Vue生命周期相关的实例方法

展开查看

参考文章: blog.csdn.net/mikon_0703/…

(1)vm.$forceUpdate

作用: 强迫Vue.js实例重新渲染,仅仅影响实例本身及插槽内容的子组件,而不是所有的子组件。

2)vm.$destory

作用: 完全销毁一个实例,清理该实例与其他实例的连接,并解绑其全部指令和监听器,同时触发beforeDestory和destroyed钩子函数。

(3)vm.$nextTick

作用: 将回调延迟到下次DOM更新循环之后执行,在执行数据后立即执行,然后等待DOM更新。

(4)vm.$mount

作用: 如果Vue实例在实例化时没有收到el选项,则它处于"未挂在"状态,用vm.$mount()手动地挂载一个未挂载的实例。

三、Vue-router

1. vue-router是什么? 它有哪些组件?

展开查看

路由就是SPA(单页应用)的路径管理器,适合用于构建单页面应用。

vue的单页面应用是基于路由组件的,路由用于设定访问路径并将路径和组件映射起来

传统的页面应用,是一些超链接来实现页面切换和跳转的。

在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。路由模块的本质就是建立起url和页面之间的映射关系

<router-link ></router-link>
<router-view></router-view>

2. active-class是哪个组件的属性?

展开查看

active-classvue-router模块的router-link组件中的属性,用来做选中样式的切换

3.怎么定义vue-router的动态路由?怎么获取传过来的值?

展开查看

在router目录下的index.js文件中,对path属性加上/:id

使用route对象的params.id,例如: this.$toute.params.id.

4. vue-router有哪几种导航钩子?

展开查看

vue-router的导航钩子,主要用来作用是拦截导航,让他完成跳转或者取消

有三种方式可以植入路由导航过程中:

  • 全局的
  • 单个路由独享的
  • 组件级的 全局导航钩子主要有3种钩子: 前置守卫全局解析守卫后置钩子

4.1全局钩子

(1)注册一个全局的前置守卫:

const router = new VueRouter({ ... });
router.beforeEach((to, from, next) => {
    // do someting
});

to: 代表要进入的目标,它是一个路由对象

from: 代表正要离开的路由,也是一个路由对象

next: 这是一个必须要调用的方法,而具体的执行效果则依赖next方法调用的参数(next函数必须调用)

注意: next(): 进行管道中的下一个钩子。

next(false): 中断当前的导航。

next('/')next({path:'/list'}): 跳转到一个不同的地址。当前导航被终端,然后进行一个新的导航。

(2)全局解析守卫

const router = new VueRouter({ ... });
router.beforeResolve((to, from, next) => {
    // do someting
});

和router.beforeEach类似,区别是在导航确认之前,同时在所有的组件内守卫和异步路由组件被解析之后,解析守卫就被调用

(3)全局后置钩子 和路由守卫不同的是,不会接受next函数,也不会改变导航本身:


router.afterEach((to, from) => {
  // ...
})

4.2路由独享的守卫

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})

4.3组件内的守卫


const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

5. routeroute和router的区别?

展开查看

router 为Vue-router的实例,是一个全局的路由对象,包含了路由的跳转的方法、钩子函数等等。

route 是路由信息对象|跳转的路由对象,每一个路由都会有一个route对象,是一个局部的对象, 包含了pathparamsquerymatchedname等路由信息参数。

6. vue-router响应式路由参数的变化?

展开查看

(1)用watch检测


watch:{
  $route(to, from){
     console.log(to.)
  }
}

(2)组件内导航钩子函数

boforeRouterUpdate(to, from, next){     
}

7.vue-router传参?

展开查看

7.1 params传参:

  • 只能用name,不能使用path;
  • (2) 参数不回显示在路径上;
  • (3) 浏览器强制刷新参数会被清空;
// 传递参数
  this.$router.push({
    name: Homeparams: {
        number: 1 ,
        code: '999'
    }
  })
  // 接收参数
  const p = this.$route.params

7.2 query传参

  • 参数会显示在路径上,刷新不回被清空
  • name可以使用path路径
    
// 传递参数
this.$router.push({
  name: Homequery: {
  number: 1 ,
  code: '999'
}
})
// 接收参数
const q = this.$route.query

8. vue-router的两种模式(hash, history)?

展开查看

hash——比如这个 URL:www.abc.com/#/hello,has… 的值为 #/hello。它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对后端完全没有影响,因此改变 hash 不会重新加载页面

history —— 利用了 HTML5 History Interface 中新增的 pushState()replaceState() 方法。(需要特定浏览器支持) 这两个方法应用于浏览器的历史记录栈,在当前已有的 back、forward、go 的基础之上,它们提供了对历史记录进行修改的功能。只是当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向后端发送请求

9. vue-router实现路由懒加载(动态加载路由)?

展开查看

当打包构建应用时,Javascript包会变得非常大,影响页面加载。如果我们能把不同的路由对应的组件分割成不同的代码块,然后当路由被访问的适合才加载对应组件,这样就更加高效了,结合Vue的异步组件和Webpack的代码分割功能,轻松实现路由组件的懒加载

9.1 第一种写法:使用AMD风格的require

const Foo = resolve => require(['./Foo.vue'], resolve);
const routers = [
    {
        path: '/',
        name: 'index',
        component: (resolve) => require(['./views/index.vue'], resolve)
    }
]

9.2 第二种写法: 使用import

const Index = () => import('@/components/Two');
const routers = [
    {
        path: '/',
        name: 'index',
        component: Index
    }
]

9.3第三种写法: 使用webpack特有的require.ensure().


const Index = r => require.ensure([], () => r(require('./views/index')), 'group-home');
const routers = [
    {
        path: '/',
        name: 'index',
        component: Index
    }
]

10. vue-router怎么重定向页面?

展开查看

重定向也是通过routes配置完成,下面例子是从/a重定向到/b:

const router = new VueTouter({
   routes:[
      {
          path:'/a', redirect:'/b'
      }
   ]
})

重定向的目标也可以是一个命名的路由

const router = new VueTouter({
   routes:[
      {
          path:'/a', redirect:{name: 'foo}
      }
   ]
})

甚至是一个方法,动态返回重定向目标:

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: to => {
      // 方法接收 目标路由 作为参数
      // return 重定向的 字符串路径/路径对象
    }}
  ]
})

12. vue-router怎么配置404页面?

展开查看

由于路由是从上到下执行的,只要在路由配置中最后面放个*号就可以了。

{
    path: '*',
    name: 'notfount',
    component: notfount
}

13. vue跳转新路由滚动到固定位置

展开查看

当创建一个Router实例,你可以提供一个scrollBehavior方法:

const router = new VueRouter({
  routes: [...],
  scrollBehavior (to, from, savedPosition) {
    // return 期望滚动到哪个的位置
  }
})

scrollBehavior方法接收to 和from路由对象。第三个参数savePosition当且仅当popstate导航时才可以用。

14. vue路由去掉#

展开查看

在使用vue进行开发的时候,我们会发现地址栏上的ip后面会跟着几个#号,如果向去掉这个#号,我们可以在路由上加上mode: 'history’,即可去掉。

export default new Router({
    mode: 'history',
    routes: [
    {
        path: '/',
        name: 'Home',
        component: Home
    }]
})

15. Vue-router跳转和location.href有什么区别?

展开查看

(1)vue-router使用pushState进行路由更新,静态跳转,页面不会重新加载;location.href会触发浏览器,页面重新加载一次;

(2)vue-router使用diff算法,实现按需加载,减少dom操作;

(3)vue-router是路由跳转或同一个页面跳转;location.href是不同页面跳转

(4)vue-router是异步加载this.$nextTick( () => (获取url)); location.href是同步加载。

16. Vue里面router-link在电脑上有用,在安卓上没反应怎么解决?

展开查看

Vue路由在Android机上有问题,babel问题,安装babel polypill插件解决。

17. Vue2中注册在router-link上事件无效解决方法?

展开查看

只需要在@click后面加上native就可以了.

<router-link @click.native="change">
  <span>{{item.text}}</span>
</router-link>

18. RouterLink在和IE和Firefox中不起作用(路由不跳转)的问题?

展开查看
  • 方法一:只用a标签,不适用button标签;
  • 方法二:使用button标签和Router.navigate方法

其他面试题

如果这篇文章有帮助到你,给个❤️关注,❤️点赞,❤️鼓励一下小编。💦💦

❤️ 笔芯 ❤️