web前端面试之vue

目录

mvc与mvvm

vue生命周期

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

vue组件通信

vue服务器渲染

vue性能优化

ue-router 有哪几种导航钩子?

vue-router如何做历史返回提示?

vue-router如何做用户登录权限等?

axios取消请求

vuex原理


mvc与mvvm

mvc

  • View:视图层 ui界面
  • controller:控制器 接受并处理用户请求通知Model改变,并将Model返回给 View
  • Model:模型 数据

 

MVVM分为Model、View、ViewModel三者。

  • Model:代表数据模型,数据和业务逻辑都在Model层中定义;
  • View:代表UI视图,负责数据的展示;
  • ViewModel:就是与界面(view)对应的Model,ViewModel的职责就是把model对象封装成可以显示和接受输入的界面数据对象。

Model和ViewModel之间有着双向数据绑定的联系。因此当Model中的数据改变时会触发View层的刷新,View中由于用户交互操作而改变的数据也会在Model中同步。

简单的说,ViewModel就是View与Model的连接器,View与Model通过ViewModel实现双向绑定。

MVVM与MVC最大的区别就是:

它实现了View和Model的自动同步,也就是当Model的属性改变时,我们不用再自己手动操作Dom元素,来改变View的显示,而是改变属性后该属性对应View层显示会自动改变

vue生命周期

加载渲染过程 父 beforeCreate -> 父 created -> 父 beforeMount ->
子 beforeCreate -> 子 created -> 子 beforeMount -> 子 mounted -> 父 mounted 子组件更新过程
父 beforeUpdate -> 子 beforeUpdate -> 子 updated -> 父 updated

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

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

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

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

具体步骤:

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

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

第三步:Watcher 订阅者是 Observer 和 Compile 之间通信的桥梁,主要做的事情是:在自身实例化时往属性订阅器(dep)里面
添加自己自身必须有一个 update()方法待属性变动 dep.notice()通知时,能调用自身的 update() 方法,并触发 Compile 中绑定的回调,则功成身退。

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

vue组件通信

父组件向子组件传值

父组件通过props向下传递数据给子组件。注:组件中的数据共有三种形式:data、props、computed

子组件向父组件传值(通过事件形式)

子组件通过events给父组件发送消息,实际上就是子组件把自己的数据发送到父组件。($emit)

常见使用场景可以分为三类:

 

  • 父子通信:

父向子传递数据是通过 props,子向父是通过 events($emit);通过父链 / 子链也可以通信($parent / $children);ref 也可以访问组件实例;provide / inject API;$attrs/$listeners

  • 兄弟通信:

Bus;Vuex

  • 跨级通信:

Bus;Vuex;provide / inject API、$attrs/$listeners

vue服务器渲染

 

vue性能优化

ue-router 有哪几种导航钩子?

三种全局导航钩子:

  • router.beforeEach(to, from, next),
  • router.beforeResolve(to, from, next),
  • router.afterEach(to, from ,next)

组件内钩子

  • beforeRouteEnter,
  • beforeRouteUpdate,
  • beforeRouteLeave

单独路由独享组件

  • beforeEnter

vue-router如何做历史返回提示?

vue-router如何做用户登录权限等?

axios取消请求

原理 将正在请求的ajax放入一个数组中 名称为url+请求方式+参数字符串=>[{ajaxName:'http://crm/login&post',fun:xxx}]
在请求的时候先去这个数组中找是否有这个ajax,如果有就调用这个ajax的fun函数,取消了上一次请求,如果没有就 在这个数组中添加上这个ajax,结束的时候将这个ajax从数组中清除了

vuex原理

Vuex实现了一个单向数据流,在全局拥有一个State存放数据,当组件要更改State中的数据时,必须通过Mutation进行,Mutation同时提供了订阅者模式供外部插件调用获取State数据的更新。而当所有异步操作(常见于调用后端接口异步获取更新数据)或批量的同步操作需要走Action,但Action也是无法直接修改State的,还是需要通过Mutation来修改State的数据。最后,根据State的变化,渲染到视图上

你可能感兴趣的:(web前端面试题,前端框架,vue.js,面试)