面试题-Vue篇

1,585 阅读2分钟

1. Vue的生命周期(必背)

  • Vue实例从创建到销毁的过程就是生命周期,也就是 开始创建 -> 初始化数据 -> 编译模板 -> 挂载DOM -> 数据更新重新渲染虚拟DOM -> 最后销毁的过程;
  • BeforeCreate:Vue实例的挂载el和数据对象,data还没进行初始化,处于undefined;
  • Created:此时可以访问data里的数据和方法,没el,没挂载DOM;
  • BeforeMount:元素el和数据对象已有,在挂载之前还是虚拟DOM节点;
  • Mounted:vue实例已经挂载到真实DOM,可通过DOM操作获取DOM节点;
  • beforeUpdate:响应式数据更新时调用,发生虚拟DOM打补丁之前,适合在更新前访问现有的DOM;
  • Updated:虚拟DOM重新渲染和打补丁之后调用,组成新的DOM已经更新,避免在这个钩子函数操作数据,防止死循环;
  • Beforedestory:vue实例销毁之前调用,可以对不用的定时器进行清除,解绑事件;
  • Destoryed:vue实例销毁后调用,调用后所有事件监听器会被移除,所有子实例都会被销毁。

2. Vue的通信方式有几种?隔代组件通信方式用哪种方式解决?(必背)

  • Props/$emit 适用父子组件通信
  • Ref与parent/parent/children适用于父子组件通信;
  • attrs/attrs/listeners 适合隔代组件通信;
  • Provide/inject适用于隔代组件的通行;
  • Evenbus(中央事件总线)适用于父子隔代兄弟组件;
  • Vuex适用于隔代组件的通信
  • Slot插槽方式

3. Vue常见指令有哪些?(背一些)

V-text/v-html/v-for/v-show/v-if/v-else/v-bind/v-on/v=model/v-slot/v-cloak

4. V-if和V-show的区别?(必背)

  • v-show操作的是DOM元素的display属性,有更高的初始渲染开销;
  • v-if操作的是DOM元素的创建和销毁,有更高的切换开销;
  • 因此,频繁的切换用v-show,切换较少用v-if。

5. 谈谈你对Vuex的理解?(硬背)

  • Vuex是一个专门为Vue.js开发的状态管理模式,vuex的应用核心就是store仓库,Store基本上就是个容器,包含着应用中大部分的state状态;
  • Vuex的状态存储是响应式的,改变store中的状态的唯一途径就是通过commit(提交)mutation,方便跟踪每一个状态的变化;
  • Vuex有几个模块
    • State:定义了应用状态的数据结构,可以在这里设置默认的初始状态;
    • Getter:允许组件从store中获取数据,mapGetters辅助函数仅仅将store中的getter映射到计算属性;
    • Mutation:唯一更改store中状态的方法,且必须是同步函数;
    • Action:用于提交mutation,而不是直接更改状态,包含异步操作;
    • Module:允许将单一的store拆分为多个store且同时保存在单一的状态树。

6. Vue中组件data为什么必须是函数?(了解)

因为js中只有函数拥有作用域,这样每个组件实例都有自己的作用域,不会相互影响。

7.  v-bind和v-model的区别?(简单的,了解下)

  • v-bind用来绑定数据和属性以及表达式;
  • v-model使用在表单中,实现双向数据绑定,在表单元素外不起作用。

8. v-model原理?(得会)

  • v-bind绑定一个value属性;
  • v-on指令给当前元素绑定input事件。

9. 双向数据绑定?(背下,接着接上响应式原理)

  • 通过V-model实现了双向数据绑定;
  • 是基于响应式原理的。

10. Vue响应式原理?(全文背诵好吧,我自己总结的,coderwhy视频最后讲的)

  • 首先通过监听器observer对data数据的所有属性进行遍历以及劫持监听,通过object.defineProperty的set方法可以监听数据的改变,通过get方法获取数据的对应的值;接着通过发布者(dep)订阅者(watcher)模式,将每个属性的get方法调用者作为watcher添加进对应的dep的subs数组里,当相应属性发生改动时,在set方法里通过调用dep的notify方法通知所有watcher调用updata方法进行页面数据更新;
  • 此外还有个解析器Compile对页面指令进行解析,将相关指令初始化成一个watcher,并替换模板数据和绑定相应的函数,以上就是响应式原理。

10. 说说Router(得了解)

  • 路由的安装(搭建路由框架)
    • 导入路由对象,并调用Vue.use ( VueRouter );
    • 创建路由实例,并且传入路由映射配置;
    • 在Vue实例中挂载创建的路由实例。
  • 使用vue-router的步骤
    • 创建路由组件
    • 配置路由映射:组件和路径映射关系
    • 使用路由:通过<router-link><router-view>
  • 可以再组件的映射关系中传参配置history模式,默认是hash模式
  • route存放pathparamsquery参数,route存放path、params、query参数,router提供push、replace、go、back等方法
  • 可以配置动态路由
  • 可以进行路由的懒加载
  • 传递参数的方式主要有params和query
  • 导航守卫:有时我们需要通过路由来进行一些操作,比如最常见的登录权限验证,当用户满足条件时,才让其进入导航,否则就取消跳转,并跳到登录页面让其登录。

11. MVC和MVVM有什么区别?(可能会问)

  • 在MVVM模式下,视图和模型只能通过ViewModel进行交互,他能监听数据的变化,然后通知视图更新,实际上实现了双向绑定;
  • MVC是应用最广的软件架构之一,分为模型,视图,控制;MVC是单向通信;
  • 区别
    • MVC中Controller演变成MVVM的ViewModel
    • MVVM通过数据来显示视图层而不是节点操作
    • MVVM主要解决了MVC中大量的dom才做使页面渲染性能降低,加载速度变慢,影响用户体验的现象。