1. 首页
  2. IT资讯

vue 面试题汇总

vue 面试题汇总
1、active-class 是哪个组件的属性?嵌套路由怎么定义

(1)、active-class 是 vue-router 模块的 router-link 组件的属性   (2)、使用 children 定义嵌套路由

Vue路由实现原理

通过改变浏览器地址URL,在不重新请求页面的情况下,更新页面视图

vue.js的核心思想包括:数据驱动和组件化思想。

vue组件keep-alive原理: 会缓存不活动的组件实例,主要用于保留组件状态或避免重新渲染。
组件之间的通信: 父传子 :prop 子传父:$emit 兄弟之间:EventBus

有两种方式:

***1.一种是# hash   ,    在地址中加入#以欺骗浏览器,地址的改变是由于正在进行页内导航      2.一种是h5的history  ,     使用URL的Hash来模拟一个完整的URL*** 

遇到的面试问题

vue 面试题汇总
watch和computed的区别是什么呢?
1)watch : 属性监听 监听属性的变化
2) computed:计算属性通过属性计算而得来的属性

**A、**watch需要在数据变化时执行异步或开销较大的操作时使用
对于任何复杂逻辑或一个数据属性在它所依赖的属性发生变化时,也要发生变化,这种情况下,我们最好使
用计算属性computed。

computed 属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。主要当作属性来使用;
computed中的函数必须用return返回最终的结果
当computed中的函数所依赖的属性如果没有发生改变的时候,那么调用当前函数的时候结果会从缓存中读取
watch 一个对象,键是需要观察的表达式,值是对应回调函数。主要用来监听某些特定数据的变化,从而进行某些具体的业务逻辑操作;
**B、**使用场景
computed     
    当一个属性受多个属性影响的时候就需要用到computed
    最典型的例子: 购物车商品结算的时候
watch
    当一条数据影响多条数据的时候就需要用watch
    搜索数据
Vue中export和export default的区别和用法
1)export 可以导出多个命名模块,export default 只能导出一个默认模块,这个模块可以匿名

  //demo1.js export const str = 'hello world'   export function f(a){     return a+1 } 

引入方式

//demo2.js import { str, f } from 'demo1' 

2)export default 只能导出一个默认模块,这个模块可以匿名

  //demo1.js export default {     a: 'hello',     b: 'world'       } 

引入方式:

//demo2.js import obj from 'demo1' 

注释(详细解释地址):

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

     在 router 目录下的 index.js 文件中,对 path 属性加上 /:id。   使用 router 对象的 params.id 获取 

3、vue-router 有哪几种导航钩子?

     **三种,** 

(1)、全局导航钩子

           1.router.beforeEach(to, from, next),      2.router.beforeResolve(to, from, next),     3,.router.afterEach(to, from ,next) 

(2)、组件内钩子

  beforeRouteEnter, beforeRouteUpdate, beforeRouteLeave 

(3)、单独路由独享组件

 beforeEnter 

4、vuex 是什么?怎么使用?哪种功能场景使用它

vuex 是专门为 vue 开发的数据状态管理模式。组件之间数据状态共享

使用场景:音乐播放、登录状态、购物车

	// 新建 store.js 	import vue from 'vue' 	import vuex form 'vuex' 	vue.use(vuex) 	export default new vuex.store({ 		//...code 	}) 	  	//main.js 	import store from './store' 


5、mvvm 框架是什么?它和其他框架(jquery) 的区别是什么?哪些场景适合

mvvm 是 model + view + viewmodel 框架,通过 viewmodel 连接数据模型modelview

区别:vue 是数据驱动,通过数据来显示视图层而不是节点操用

场景:数据操作比较多的场景,更加快捷

6、自定义指令(v-check, v-focus) 的方法有哪些? 它有哪些钩子函数? 还有哪些钩子函数参数

	全局定义指令:在 vue 对象的 directive 方法里面有两个参数, 一个是指令名称, 另一个是函数。 	 	  组件内定义指令:directives 	 	  钩子函数: bind(绑定事件出发)、inserted(节点插入时候触发)、update(组件内相关更新) 	 	  钩子函数参数: el、binding 

7、vue 的双向绑定的原理是什么

vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

具体步骤:

第一步:需要 observe 的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter 和 getter 这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据变化

第二步:compile解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图

第三步:Watcher订阅者是Observer和Compile之间通信的桥梁,主要做的事情是:

1、在自身实例化时往属性订阅器(dep)里面添加自己

2、自身必须有一个update()方法

3、待属性变动dep.notice()通知时,能调用自身的 update() 方法,并触发Compile中绑定的回调,则功成身退。

第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听自己的model数据变化,通过Compile来解析编译模板指令,最终利用Watcher搭起Observer和Compile之间的通信桥梁,达到数据变化 -> 视图更新;视图交互变化(input) -> 数据model变更的双向绑定效果。

vuex 面试题

1、有哪几种属性

有 5 种,分别是 state、getter、mutation、action、module

2、vuex 的 store 特性是什么

(1) vuex 就是一个仓库,仓库里放了很多对象。其中 state 就是数据源存放地,对应于一般 vue 对象里面的 data

(2) state 里面存放的数据是响应式的,vue 组件从 store 读取数据,若是 store 中的数据发生改变,依赖这相数据的组件也会发生更新

(3) 它通过 mapState 把全局的 state 和 getters 映射到当前组件的 computed 计算属性

3、 vuex 的 getter 特性是什么

(1) getter 可以对 state 进行计算操作,它就是 store 的计算属性

(2) 虽然在组件内也可以做计算属性,但是 getters 可以在多给件之间复用

(3) 如果一个状态只在一个组件内使用,是可以不用 getters

4、vuex 的 mutation 特性是什么

action 类似于 muation, 不同在于:action 提交的是 mutation,而不是直接变更状态

action 可以包含任意异步操作

5、vue 中 ajax 请求代码应该写在组件的methods中还是vuex 的action中

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

如果被其他地方复用,请将请求放入 action 里,方便复用,并包装成 promise 返回

5、不用 vuex 会带来什么问题

可维护性会下降,你要修改数据,你得维护3个地方

可读性下降,因为一个组件里的数据,你根本就看不出来是从哪里来的

增加耦合,大量的上传派发,会让耦合性大大的增加,本来Vue用Component就是为了减少耦合,现在这么用,和组件化的初衷相背

生命周期面试题

1、什么是 vue 生命周期

vue 实例从创建到销毁的过程就是生命周期。

也就是从开始创建、初始化数据、编译模板、挂在 dom -> 渲染、更新 -> 渲染、写在等一系列过程

2、vue生命周期的作用是什么

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

3、请详细说下你对vue生命周期的理解

总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。

创建前/后

在beforeCreated阶段,vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。

在created阶段,vue实例的数据对象data有了,$el还没有。

载入前/后

在beforeMount阶段,vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换。

在mounted阶段,vue实例挂载完成,data.message成功渲染。

更新前/后

当data变化时,会触发beforeUpdate和updated方法。

销毁前/后

在执行destroy方法后,对data的改变不会再触发周期函数,说明此时vue实例已经解除了事件监听以及和dom的绑定,但是dom结构依然存在

4、第一次页面加载会触发哪几个钩子

第一次加载会触发 beforeCreate、created、beforeMount、mounted

5、DOM 渲染在哪个周期中就已经完成

mounted

6、简述每个周期具体适合哪些场景

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

beforecreate : 可以在这加个loading事件,在加载实例时触发

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

mounted : 挂载元素,获取到DOM节点 updated : 如果对数据统一处理,在这里写上相应函数

beforeDestroy : 可以做一个确认停止事件的确认框 nextTick : 更新数据后立即操作dom

axios面试题及答案

1、axios的特点有哪些?

答: 一、Axios 是一个基于 promise 的 HTTP 库,支持promise所有的API 二、它可以拦截请求和响应 三、它可以转换请求数据和响应数据,并对响应回来的内容自动转换成 JSON类型的数据 四、安全性更高,客户端支持防御 XSRF 

2、axios有哪些常用方法?

	答: 	一、axios.get(url[, config])   //get请求用于列表和信息查询 	二、axios.delete(url[, config])  //删除 	三、axios.post(url[, data[, config]])  //post请求用于信息的添加 	四、axios.put(url[, data[, config]])  //更新操作 

3、说下你了解的axios相关配置属性?

 答: `url`是用于请求的服务器URL  `method`是创建请求时使用的方法,默认是get  `baseURL`将自动加在`url`前面,除非`url`是一个绝对URL。它可以通过设置一个`baseURL`便于为axios实例的方法传递相对URL  `transformRequest`允许在向服务器发送前,修改请求数据,只能用在'PUT','POST'和'PATCH'这几个请求方法 

1.headers是即将被发送的自定义请求头

headers:{'X-Requested-With':'XMLHttpRequest'}, 

2.params是即将与请求一起发送的URL参数,必须是一个无格式对象(plainobject)或URLSearchParams对象

params:{ 		ID:12345 		}, 

3.auth表示应该使用HTTP基础验证,并提供凭据
这将设置一个Authorization头,覆写掉现有的任意使用headers设置的自定义Authorization

auth:{ 	username:'janedoe', 	password:'s00pers3cret' 	}, 

4.’proxy’定义代理服务器的主机名称和端口
auth表示HTTP基础验证应当用于连接代理,并提供凭据
这将会设置一个Proxy-Authorization头,覆写掉已有的通过使用header设置的自定义Proxy-Authorization头。

proxy:{ 	    host:'127.0.0.1', 	    port:9000, 	    auth::{ 	    username:'mikeymike', 	    password:'rapunz3l'       } }, 

4.例子
1、 发送一个GET请求

//通过给定的ID来发送请求 				axios.get('/user?ID=12345') 				  .then(function(response){ 				    console.log(response); 				  }) 				  .catch(function(err){ 				    console.log(err); 				  }); //以上请求也可以通过这种方式来发送 				axios.get('/user',{ 				  params:{ 				    ID:12345 				  } 				}) 				.then(function(response){ 				  console.log(response); 				}) 				.catch(function(err){ 				  console.log(err); 				}); 

2、 发送一个POST请求

	    axios.post('/user',{ 	      firstName:'Fred', 	      lastName:'Flintstone' 	    }) 	    .then(function(res){ 	      console.log(res); 	    }) 	    .catch(function(err){ 	      console.log(err); 	    }); 

3、 一次性并发多个请求

	    function getUserAccount(){ 	      return axios.get('/user/12345'); 	    } 	    function getUserPermissions(){ 	      return axios.get('/user/12345/permissions'); 	    } 	    axios.all([getUserAccount(),getUserPermissions()]) 	      .then(axios.spread(function(acct,perms){  //当这两个请求都完成的时候会触发这个函数,两个参数分别代表返回的结果 	      })) 

5.拦截器

1.你可以在请求、响应在到达then/catch之前拦截他们

//添加一个请求拦截器 axios.interceptors.request.use(function(config){   //在请求发出之前进行一些操作   return config; },function(err){   //Do something with request error   return Promise.reject(error); }); //添加一个响应拦截器 axios.interceptors.response.use(function(res){   //在这里对返回的数据进行处理   return res; },function(err){   //Do something with response error   return Promise.reject(error); }) 

2.取消拦截器

var myInterceptor = axios.interceptor.request.use(function(){/*....*/}); axios.interceptors.request.eject(myInterceptor); 

3.给自定义的axios实例添加拦截器

var instance = axios.create(); instance.interceptors.request.use(function(){}) 

发布了48 篇原创文章 · 获赞 25 · 访问量 1万+

原文始发于:

主题测试文章,只做测试使用。发布者:貪圖浪蕩,转转请注明出处:http://www.cxybcw.com/139048.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code