2021Vue.js面试题汇总及答案【全网最全 建议收藏】(三)

简介: 2021Vue.js面试题汇总及答案【全网最全 建议收藏】

二、组件 Component


2.1.vue中如何编写可复用的组件 (编写组件的原则)


以组件功能命名


只负责ui的展示和交互动画,不要在组件里与服务器打交道(获取异步数据等)

可复用组件不会因组件使用的位置、场景而变化。尽量减少对外部条件的依赖。


2.2.如何让CSS只在当前组件中起作用?


在每一个Vue.js组件中都可以定义各自的CSS、 JavaScript代码。如果希望组件内写的CSS只对当前组件起作用,只需要在Style标签添加Scoped属性即可


2.3.keep-alive是什么?


如果需要在组件切换的时候,保存一些组件的状态防止多次渲染,就可以使用 keep-alive 组件包裹需要保存的组件。


两个重要属性,include 缓存组件名称,exclude 不需要缓存的组件名称。


2.4.如何在 Vue. js动态插入图片


对“src”属性插值将导致404请求错误。应使用 v-bind:src (简写:src)格式代替。


2.5.父子组件的生命周期顺序(可参照上方图解)


加载渲染过程:

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

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

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

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


三、Vuex


3.1.vuex的核心概念


1.state => 基本数据

2.getters => 从基本数据派生的数据

3.mutations => 修改数据,同步

4.actions => 修改数据,异步 (Action 提交的是 mutation,而不是直接变更状态)

5.modules => 模块化Vuex


3.2.vuex是什么?怎么使用?哪种功能场景使用它?


Vuex 是一个专为 Vue.js 应用程序开发的状态管理器,采用集中式存储管理应用的所有组件的状态,主要是为了多页面、多组件之间的通信。


Vuex有5个重要的属性,分别是 State、Getter、Mutation、Action、Module,由 view 层发起一个 Action 给 Mutation,在 Mutation 中修改状态,返回新的状态,通过 Getter暴露给 view层的组件或者页面,页面监测到状态改变于是更新页面。如果你的项目很简单,最好不要使用 Vuex,对于大型项目,Vuex 能够更好的帮助我们管理组件外部的状态,一般可以运用在购物车、登录状态、播放等场景中。


3.3.多个组件之间如何拆分各自的state,每块小的组件有自己的状态,它们之间还有一些公共的状态需要维护,如何思考这块


1.公共的数据部分可以提升至和他们最近的父组件,由父组件派发

2.公共数据可以放到vuex中统一管理,各组件分别获取


3.4.Vue.js中ajax请求代码应该写在组件的methods中还是vuex的actions中?


1.如果请求来的数据是不是要被其他组件公用,仅仅在请求的组件内使用,就不需要放入vuex 的state里。


2.如果被其他地方复用,这个很大几率上是需要的,如果需要,请将请求放入action里,方便复用,并包装成promise返回,在调用处用async await处理返回的数据。如果不要复用这个请求,那么直接写在vue文件里很方便


3.5.Vuex中如何异步修改状态


actions与mutations作用类似,都是可以对状态进行修改。不同的是actions是异步操作的。


actions是可以调用Mutations里的方法的

const actions={
  addActions(context){
    context.commit('add',10);//调用mutations中的方法
    setTimeout(()=>{context.commit('reduce')},5000)
  //  setTimeOut(()=>{context.commit('reduce')},3000);
    console.log('我比reduce提前执行');
  },
  reduceActions({commit}){
    commit('reduce');
  }
}


3.6.Vuex中actions和mutations的区别


Mutation 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数


const store = new Vuex.Store({
  state: {
    count: 1
  },
  mutations: {
    increment (state) {
      // 变更状态
      state.count++
    }
  }
})

Action Action 类似于 mutation,不同在于:


Action 提交的是 mutation,而不是直接变更状态。


Action 可以包含任意异步操作

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit('increment')
    }
  }
})


3.7.怎么在组件中批量使用Vuex的state状态?


使用mapState辅助函数, 利用对象展开运算符将state混入computed对象中

import {mapState} from 'vuex' export default{ computed:{ ...mapState(['price','number']) } }


3.8.Vuex中状态是对象时,使用时要注意什么?


对象是引用类型,复制后改变属性还是会影响原始数据,这样会改变state里面的状态,是不允许,所以先用深度克隆复制对象,再修改。


四、Router


4.1.vue-router 路由模式有几种


1.Hash: 使用 URL 的 hash 值来作为路由。支持所有浏览器。 带#。如:http://localhost:8080/#/pageA。改变hash,浏览器本身不会有任何请求服务器动作的,但是页面状态和url已经关联起来了。


2.History: 以来 HTML5 History API 和服务器配置。参考官网中 HTML5 History 模式,不带#, 如:http://localhost:8080/ 正常的而路径,并没有#。基于HTML5的 pushState、replaceState实现


3.Abstract: 支持所有 javascript 运行模式。如果发现没有浏览器的 API,路由会自动强制进入这个模式。


4.2.vue-router如何定义嵌套路由


通过children 数组:

const router = new VueRouter({
  routes: [
    {
      path: "/parentPage",
      component: testPage,
      children: [
        {
          path: "/childrenA",
          component: childrenComponentA,
        },
        {
          path: "/childrenB",
          component: childrenComponentB,
        },
      ],
    },
    {
      // 其他和parentPage平级的路由
    },
  ],
});


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


1.全局导航钩子:router.beforeEach(to,from,next)

2.组件内的钩子beforeRouteEnter (to, from, next) beforeRouteUpdate (to, from, next) beforeRouteLeave (to, from, next)

3.单独路由独享组件 beforeEnter: (to, from, next)


参数:有to(去的那个路由)、from(离开的路由)、next(一定要用这个函数才能去到下一个路由,如果不用就拦截)最常用就这几种


4.4. $ route和$ router的区别


1.$route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数。


1.$route.path 字符串,对应当前路由的路径,总是解析为绝对路径如"/foo/bar"。


2. $route.params 一个 key/value 对象,包含了 动态片段 和 全匹配片段, 如果没有路由参数,就是一个空对象。


3. $route.query 一个 key/value 对象,表示 URL 查询参数。 例如,对于路径 /foo?user=1,则有$route.query.user == 1, 如果没有查询参数,则是个空对象


4. $route.hash 当前路由的hash值 (不带#) ,如果没有 hash 值,则为空字符串


5. $route.fullPath 完成解析后的 URL,包含查询参数和hash的完整路径。


6. $route.matched 数组,包含当前匹配的路径中所包含的所有片段所对应的配置参数对象。


7. $route.name 当前路径名字


8. $ route.meta 路由元信息


$router是“路由实例”对象包括了路由的跳转方法,钩子函数等

实例方法:


1、push


1.字符串this.$router.push('home')

2. 对象this.$router.push({path:'home'})

3. 命名的路由this.$router.push({name:'user',params:{userId:123}})

4.带查询参数,变成 /register?plan=123this.$router.push({path:'register',query:{plan:'123'}})

push方法其实和< router-link :to="…">是等同的。

注意:push方法的跳转会向 history 栈添加一个新的记录,当我们点击浏览器的返回按钮时可以看到之前的页面。


2、go

页面路由跳转

前进或者后退this.$router.go(-1) // 后退

3、replace

push方法会向 history 栈添加一个新的记录,而replace方法是替换当前的页面,

不会向 history 栈添加一个新的记录


4.5.路由之间跳转的方式


1.声明式(标签跳转)

2.编程式( js跳转)


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


vue-router 模块 的router-link组件


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


把不同路由对应的组件分割成不同的代码块,然后当路由被访问时才加载对应的组件即为路由的懒加载,可以加快项目的加载速度,提高效率


const router = new VueRouter({
  routes: [
    {
      path: '/home',
      name: 'Home',
      component:() = import('../views/home')
    }
  ]
})


4.8.怎么定义vue-router的动态路由以及如何获取传过来的动态参数?


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

  1. 使用router对象的params id

目录
相关文章
|
13天前
|
前端开发 JavaScript 网络协议
前端最常见的JS面试题大全
【4月更文挑战第3天】前端最常见的JS面试题大全
33 5
|
2天前
|
JavaScript 前端开发 测试技术
「一劳永逸」送你21道高频JavaScript手写面试题(上)
「一劳永逸」送你21道高频JavaScript手写面试题
20 0
|
1月前
|
JavaScript 前端开发 API
vue面试题目汇总
vue面试题目汇总
30 4
|
1月前
|
设计模式 JavaScript 前端开发
最常见的26个JavaScript面试题和答案
最常见的26个JavaScript面试题和答案
42 1
|
1月前
|
缓存 JavaScript 前端开发
Vue常见面试题 标准答案汇总一
Vue常见面试题 标准答案汇总一
35 1
|
1月前
|
存储 JavaScript 前端开发
【JavaScript】面试手撕浅拷贝
引入 浅拷贝和深拷贝应该是面试时非常常见的问题了,为了能将这两者说清楚,于是打算用两篇文章分别解释下深浅拷贝。 PS: 我第一次听到拷贝这个词,有种莫名的熟悉感,感觉跟某个英文很相似,后来发现确实Copy的音译,感觉这翻译还是蛮有意思的
45 6
|
1月前
|
JavaScript 前端开发
【JavaScript】面试手撕节流
上篇我们讲了防抖,这篇我们就谈谈防抖的好兄弟 -- 节流。这里在老生常谈般的提一下他们两者之间的区别,顺带给读者巩固下。
51 3
|
2月前
|
前端开发 JavaScript UED
【JavaScript】面试手撕防抖
防抖: 首先它是常见的性能优化技术,主要用于处理频繁触发的浏览器事件,如窗口大小变化、滚动事件、输入框内容改变等。在用户连续快速地触发同一事件时,防抖机制会确保相关回调函数在一个时间间隔内只会被执行一次。
36 0
|
2月前
|
前端开发 JavaScript 算法
【JavaScript】面试手撕数组排序
这章主要讲的是数组的排序篇,我们知道面试的时候,数组的排序是经常出现的题目。所以这块还是有必要进行一下讲解的。笔者观察了下前端这块的常用算法排序题,大概可以分为如下
24 2
|
2月前
|
JavaScript 前端开发 索引
【JavaScript】面试手撕数组原型链(易)
续借上文,这篇文章主要讲的是数组原型链相关的考题,有些人可能会纳闷,数组和原型链之间有什么关系呢?我们日常使用的数组forEach,map等都是建立在原型链之上的。举个🌰,如我有一个数组const arr = [1,2,3]我想要调用arr.sum方法对arr数组的值进行求和,该如何做呢?我们知道数组没有sum函数,于是我们需要在数组的原型上定义这个函数,才能方便我们调用,具体代码如下。接下来我们就是采用这种方式去实现一些数组常用的方法。
39 6