黑马程序员技术交流社区
标题:
【西安校区】vue面试题
[打印本页]
作者:
逆风TO
时间:
2019-8-22 10:39
标题:
【西安校区】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(创建后)完成数据观测,属性和方法的运算,初始化事件,el属性还没有显示出来beforeMount(载入前)在挂载开始之前被调用,相关的render汉书首次调用,实例已完成以下的配置:编译模版,把data里面的数据和模版生成html注意此时还没有挂载html到页面上。mounted(载入后)在el被新创建的vm. el属性还没有显示出来 beforeMount(载入前)在挂载开始之前被调用,相关的render汉书首次调用,实例已完成以下的配置:编译模版,把data里面的数据和模版生成html注意此时还没有挂载html到页面上。mounted(载入后) 在el 被新创建的 vm.el属性还没有显示出来beforeMount(载入前)在挂载开始之前被调用,相关的render汉书首次调用,实例已完成以下的配置:编译模版,把data里面的数据和模版生成html注意此时还没有挂载html到页面上。mounted(载入后)在el被新创建的vm.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实现简单的双向绑定:
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: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>'}
1
2
3.定义路由
const routes = [
{path: '/foo', component: Foo}
{path: '/bar', component: Bar}
]
1
2
3
4
4.创建路由实例,然后传routes配置
const router = new VueRouter({
routes //相当于routes:routes
})
1
2
3
5.创建和挂载根实例
const app = new Vue({
router
}).$mount('#app')
1
2
3
通过注入路由器,我们可以在任何组件内通过this.router访问路由器,也可以通过this. 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)
}
})
③ 指令的使用
<div>
<div v-dir1></div>
<div v-dir2></div>
</div>
8.vue路由的钩子函数
首页可以控制导航跳转,beforeEach,afterEach等,一般用于页面title的修改。一些需要登录才能调整页面的重定向功能。
beforeEach主要有3个参数to,from,next:
to:route即将进入的目标路由对象,
from:route当前导航正要离开的路由
next:function一定要调用该方法resolve这个钩子。执行效果依赖next方法的调用参数。可以控制网页的跳转。
9.vue如何定义一个过滤器
html代码:
<div id="app">
<input type="text" v-model="msg" />
{{msg | capitalize }}
</div>
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即可,例如<style scoped></style>
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。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2