Vue相关面试题

对于MVVM的理解


MVVM是Model-View-ViewModel缩写,也就是把MVC中的Controller演变成ViewModel。Model层代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会绑定到viewModel层并自动将数据渲染到页面中,视图变化的时候会通知viewModel层更新数据。

MVVM 是 Model-View-ViewModel 的缩写

Model: 代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。我们可以把Model称为数据层,因为它仅仅关注数据本身,不关心任何行为

View: 用户操作界面。当ViewModel对Model进行更新的时候,会通过数据绑定更新到View

ViewModel:业务逻辑层,View需要什么数据,ViewModel要提供这个数据;View有某些操作,ViewModel就要响应这些操作,所以可以说它是Model for View.

MVVM模式简化了界面与业务的依赖,解决了数据频繁更新。MVVM 在使用当中,利用双向绑定技术,使得 Model 变化时,ViewModel 会自动更新,而 ViewModel 变化时,View 也会自动变化。


Vue生命周期

vue实例从创建到销毁的过程,就是生命周期。从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、销毁等一系列过程被称之为vue生命周期。

vue生命周期挂在了很多钩子函数,我们可以更方便和更有逻辑的控制整个vue的实例化的过程

vue生命周期分为八个阶段 创建前/后,加载前/后 ,更新前/后,销毁前/后 

页面第一次加载的时候 会触发beforeCreate、created、beforeMount、mounted这几个钩子,在mounted的时候会渲染完成DOM。


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变更双向绑定效果。


vue实现双向绑定原理

Vue组件之间传递参数

父子之间传递参数:父组件传给子组件:子组件通过props方法接受数据;子组件传给父组件:$emit 方法传递参数

非父子组件间的数据传递,兄弟组件传值  用eventBus(适合小项目)或者VUEX


Vue路由

路由模式:hash模式 和 history模式

hash模式:在浏览器中符号“#”,#以及#后面的字符称之为hash,用 window.location.hash 读取。特点:hash虽然在URL中,但不被包括在HTTP请求中;用来指导浏览器动作,对服务端安全无用,hash不会重加载页面。

history模式:history采用HTML5的新特性;且提供了两个新方法:pushState(), replaceState()可以对浏览器历史记录栈进行修改,以及popState事件的监听到状态变更


路由钩子函数

全局钩子函数(beforeEach、afterEach)

路由独享的钩子函数(beforeEnter)

组件内钩子函数(beforeRouterEnter、beforeRouterUpdate、beforeRouterLeave)

beforeEach一共接收三个参数,分别是to、from、next;to:即将进入的路由对象;from:正要离开的路由对象;next:路由的控制参数;

AfterEach和beforeEach一样都是属于全局守卫钩子,都是在main.js中进行调用;其中AfterEach比beforeEach少一个next参数;to:即将要进入的路由对象;from:正要离开的路由对象;

beforeEneter 指定的路由才有的钩子函数,通常这类路由独享的钩子函数我们是在路由配置文件中进行配置,只能设置改变前的钩子,不能设置改变后的钩子,只能在设置的路由 才能触发这个钩子函数,其他页面是不会触发的,也有to,from,next三个参数

beforeRouterEnter(to,from,next)是唯一一个不能使用this的钩子函数,因为此时的vue实例还没有创建;to:即将要进入的路由对象;from:正要离开的路由对象;next:路由控制参数

beforeRouterUpdate(to,from,next) 在路由发生修改的时候进行调用

beforeRouterLeave(to,from,next) 在路由离开该组件时调用;

路由之间跳转

或者 router.push('index')

$route和$router的区别

$route是“路由信息对象”,包括path,params,hash,query,fullPath,matched,name等路由信息参数;而$router是“路由实例”对象包括了路由的跳转方法,钩子函数等

例如     this.$router.push({

               path: "/ems/emsAddPlan",

               query: { id: this.$route.query.id }

         });


 v-if 和 v-show 区别

v-if按照条件是否渲染,v-show是display的block或none;


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

将当前组件的