vue面试题

vue面试题

1.Vue和react的相同与不同
相同点:

  • 都支持服务器端渲染
  • 都有virtual DOM,组件化开发,通过props参数进行父子组件数据的传递,都实现webComponent规范
  • 数据驱动视图
  • 都有支持native的方案,react native,Vue的weex
  • 都有管理状态,react有redux,vue有自己的VueX

不同点:

  • react严格上只针对MVC的view层,Vue则是MVVM模式

  • virtual DOM不一样,Vue会跟踪每一个组建的依赖关系,不需要重新渲染整个组件树。而对于react而言,每当应用的状态被改变时,全部组件都会重新渲染,所以react中会需要shouldcomponentUpdate这个生命周期函数方法来进行控制

  • 组件写法不一样, React推荐的做法是 JSX + inline style, 也就是把HTML和CSS全都写进JavaScript了,即’all in js’; Vue推荐的做法是webpack+vue-loader的单文件组件格式,即html,css,jd写在同一个文件;

  • .数据绑定: vue实现了数据的双向绑定,react数据流动是单向的

  • .state对象在react应用中不可变的,需要使用setState方法更新状态;
    在vue中,state对象不是必须的,数据由data属性在vue对象中管理;
    2.对于MVVM的理解
    MVVM是Model-view-View Model的缩写
    model代表数据模型,也可以在model中定义数据修改和操作的业务逻辑
    view代表UI组件,它负责数据模型转化成ui展现出来
    ViewModel 监听模型数据的改变和控制视图行为、处理数据交互,简单理解就是一个同步View和Model的对象,连接Model和View
    在MVVM架构下,view和model之间并没有直接的联系,而是通过view Model进行交互,model和view Model之间的交互是双向的,因此view数据的变化会同步到model中,而Model数据的变化也会立即反应到view上
    view Model通过双向数据绑定把view层和model层连接了起来,而view和Model之间的同步工作完全是自动的,无需人为干涉,因此开发者只需要关注业务逻辑,不需要手动操作DOM,不需要关注数据状态的同步问题,复杂的数据状态维护完全由MVVM来统一管理
    3.Vue的生命周期
    beforeCreate(创建前)在数据观测和初始化事件还未开始
    created(创建后)完成数据观测,属性和方法的运算,初始化事件, e l 属 性 还 没 有 显 示 出 来 b e f o r e M o u n t ( 载 入 前 ) 在 挂 载 开 始 之 前 被 调 用 , 相 关 的 r e n d e r 汉 书 首 次 调 用 , 实 例 已 完 成 以 下 的 配 置 : 编 译 模 版 , 把 d a t a 里 面 的 数 据 和 模 版 生 成 h t m l 注 意 此 时 还 没 有 挂 载 h t m l 到 页 面 上 。 m o u n t e d ( 载 入 后 ) 在 e l 被 新 创 建 的 v m . el属性还没有显示出来 beforeMount(载入前)在挂载开始之前被调用,相关的render汉书首次调用,实例已完成以下的配置:编译模版,把data里面的数据和模版生成html注意此时还没有挂载html到页面上。 mounted(载入后) 在el 被新创建的 vm. elbeforeMountrenderdatahtmlhtmlmountedelvm.el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。
    beforeUpdate(更新前) 在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。
    updated(更新后) 在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。
    beforeDestroy(销毁前) 在实例销毁之前调用。实例仍然完全可用。
    destroyed(销毁后) 在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。
    a. 什么是生命周期?
    vue实例从创建到销毁的过程,就是生命周期,从开始创建、初始化数据、编译模版、挂在DOm→渲染、更新→渲染、销毁等一系列过程,称之为vue的生命周期
    b. vue生命周期的作用是什么?
    vue的生命周期中有很多个事件钩子,让我们在控制整个vue实例的过程时更容易形成好的逻辑
    c. vue生命周期总共有几个阶段?
    分为8个阶段,创建前/创建后、载入前/载入后、更新前/更新后、销毁前/销毁后
    d. 第一次页面加载会触发哪几个钩子
    会触发beforeCreate、created、beforeMount、mounted
    e、DOM渲染在哪个周期中就已经完成?
    DOM渲染在mounted中就已经完成了
    4.Vue实现数据双向绑定的原理:Object.defineProperty()
    vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过object.defineProperty()来劫持各个属性的setter、getter、在数据变动时发布消息给订阅者,触发相应监听回调,当把一个普通javascript对象传给Vue实例来作为它的data选项时,vue将遍历它的属性,用object.defineProperty将他们转为getter/setter。用户看不到getter/setter,但是在内部它们让vue追踪依赖,在属性被访问和修改时通知变化。
    vue的数据双向绑定将MVVM作为数据绑定的入口,整合observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模版指令(vue中用来解析{{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化—>视图更新;视图交互变化(input)—>数据model变更双向绑定效果
    js实现简单的双向绑定:
    vue面试题_第1张图片
    5.Vue组件间的参数传递

    • 父组件与子组件传值
      父组件传给子组件:子组件通过props方法接受数据
      子组件传给父组件:$emit方法传递参数
    • 非父子组件间的数据传递,兄弟组件传值
      eventBus,就是创建一个事件中心,相当于中转站,可以用它来传递事件和接收事件。项目比较小时,用这个比较合适、

6. vue的路由vue-router
vue-router是vue.js官方的路由管理器
vue-router的使用:
1.安装并引入vue-router
安装:npm i vue-router --save-dev
引入:import VueRouter from ‘vue-router’
执行vuerouter:Vue.use(VueRouter)
2.定义路由组件

const Foo = { template:  '
foo
' } const Bar = { template: '
bar
'}

3.定义路由

const routes = [
   {path: '/foo', component: Foo}
   {path: '/bar', component: Bar}
]

4.创建路由实例,然后传routes配置

const router = new VueRouter({
	routes //相当于routes:routes
})

5.创建和挂载根实例

const app = new Vue({
	router
}).$mount('#app')

通过注入路由器,我们可以在任何组件内通过this. r o u t e r 访 问 路 由 器 , 也 可 以 通 过 t h i s . router访问路由器,也可以通过this. router访this.route访问当前路由

7.vue-cli如何新增自定义指令

① 创建局部指令:
var app = new Vue({
	el: '#app',
	data: {},
	//创建指令
	directives: {
		// 指令名称
			dir1: {
				 inserted(el) {
					 // 指令中第一个参数是当前使用指令的DOM
				 	console.log(el)
				 	//  对DOM进行操作
				 	el.style.width = '200px'
				 }
			}
	}
})
② 创建全局指令
Vue.directive('dir2', {
	inserted(el) {
		console.log(el)
	}
})
③  指令的使用

8.vue路由的钩子函数
首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改。一些需要登录才能调整页面的重定向功能。

beforeEach主要有3个参数to,from,next:

to:route即将进入的目标路由对象,

from:route当前导航正要离开的路由

next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。
9.vue如何定义一个过滤器

html代码:
	
{{msg | capitalize }}
js代码 var vm=new Vue({ el:"#app", data:{ msg:'' }, filters: { capitalize: function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) } } }) 全局定义过滤器 Vue.filter('capitalize', function (value) { if (!value) return '' value = value.toString() return value.charAt(0).toUpperCase() + value.slice(1) })

10、一句话就能回答的面试题

1.如何让css只在当前组件起作用
	在style标签中写入scoped即可,例如
2.vi-if 和v-show的区别
	v-if按照条件是否渲染,v-show是display的block和none
3.$route和$router的区别
	$route是路由信息对象,包含path,params,hash,query,fullPath,matched,name等路由信息参数。而$router是路由实例,对象包含了路由的跳转方法,钩子函数等
4.vue.js的两个核心是什么
	数据驱动和组件系统
5.什么是vue的计算属性
	在模板中放入太多的逻辑会让模板过重且难以维护,在需要对数据进行复杂处理,且可能多次使用的情况下,尽量采取计算属性的方式。好处:①使得数据处理结构清晰;②依赖于数据,数据更新,处理结果自动更新;③ 计算属性内部的this执行VM实例;④ 在template调用时,直接写计算属性名即可;⑤常用的是getter方法,获取数据,也可以使用set方法改变数据;⑥相较于methods,不管依赖的数据变不变,methods都会重新计算,但是依赖数据不变的时候computed从缓存中获取,不会重新计算
6. vue等单页面应用及其优缺点
	优点:vue的目标是通过尽可能简单的API实现响应的数据绑定和组合的视图组件,核心是一个响应的数据绑定系统。MVVM、数据驱动、组件化、轻量、简洁、高效、快速、模块友好
	缺点:不支持低版本浏览器,最低只支持到IE9;不利于SEO的优化(如果要支持SEO,建议通过服务器来进行渲染组件);第一次加载首页耗时相对长一些;不可以使用浏览器的导航按钮需要自行实现前进、后退
11、怎么定义vue-router的动态路由,怎么获取传过来的值
	在router目录下的index.js文件中,对path属性加上/:id,使用router对象的params.id获取

11.VUX
vueX:专门为vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证以一种可预测的方式发生变化
state
Vuex 使用单一状态树,即每个应用将仅仅包含一个store 实例,但单一状态树和模块化并不冲突。存放的数据状态,不可以直接修改里面的数据。
mutations
mutations定义的方法动态修改Vuex 的 store 中的状态或数据。
getters
类似vue的计算属性,主要用来过滤一些数据。
action
actions可以理解为通过将mutations里面处里数据的方法变成可异步的处理数据的方法,简单的说就是异步操作数据。view 层通过 store.dispath 来分发 action。
vue面试题_第2张图片

你可能感兴趣的:(vue面试题)