vue面试题和项目中遇到的坑

写在前面

之前有提到,在经历了前端转型之后,一场技术变革的到来,小程序,h5移动端,对性能优化的要求越来越高,受面向对象思想编程方式的影响,前端现在主流的技术框架就是Vue,React,Angular.他们的数据驱动模式,MVVM模式,很受欢迎,这种spa单页面应用,组件思维对一个庞大的web应用很有帮助提升加载速度,减少Dom操作,随之而来的也就是不断地学习,对技术员的技术要求也开始偏向于vue,小程序,公众号,由于智能手机的普及,app端比网页更受欢迎,所以就要不断地学习新的知识,否则会被淘汰。


vue3.0的响应式原理已经更新,详情请移步vue2.0和3.0的响应式原理以及区别 

在面试的时候肯定免不了被问到其他知识点例如es6,javascript,css3我也总结出来了,详情请移步

es6语法的知识点和面试题总结

前端面试题总结以及一些面试心得

微信小程序的面试题以及项目中遇到的坑

一,谈谈你对MVVM 的理解?

MVVM 由 Model,View,ViewModel 三部分构成,Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。
在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上。
ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

二,vue路由传参的方式

  • router.js 后边跟:id配置参数
  • query 方法传参
  • name 方法传参
  • vue自带标签标签传参
  • 详情请看Vue $router 路由传参的3种方法详解

三,vue组件之间的传参

  • 父传子 props
  • 子传父 this.$emit
  • 非父子组件 eventHub 中转站 this.$on
  • vuex state 存的变量,mutations改变的状态 actions 触发的行为(方法)
    组件传参具体的传参请参考vue2.0父子组件以及非父子组件通信传参详解
    vuex stroe 具体的请参考vuex原理,用法踩坑小计

四,vue-router有哪几种导航钩子?

  • 第一种是全局导航钩子(全局守卫):router.beforeEach(to,from,next),作用:跳转前进行判断拦截。
  • 第 二种:全局解析守卫router.beforeResolve,在导航被确认前,所有组件内守卫和异步路由组件被解析之后,解析守卫就被调用。(2.5.0新增)。
  • 第三种:单独路由独享的守卫beforeEnter,在路由配置时定义,与全局守卫的方法是一样的。
  • 第四种:组件内的守卫。直接在路由组件内定义守卫,
    以下为官网文档的介绍:
  beforeRouteEnter (to, from, next) {
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }

五,请写出几种常用的vue指令 

v-once、v-for、v-if、v-show、v-on,v-model

六,请详细解释一下vue(2.0)的生命周期?

生命周期 阶段 描述
beforeCreated 创建前 vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。
created 创建后 vue实例的数据对象data有了,$el还没有。
beforeMount 模板载入前 vue实例的$el和data都初始化了,但还是挂载之前为虚拟的dom节点,data.message还未替换
mounted 模板载入后 vue实例挂载完成,data.message成功渲染。
beforeUpdate 组件更新前 组件更新之前调用
updated 组件更新后 组件更新之后调用
beforeDestroy 组件销毁前 调用$destroy方法后,立即执行beforeDestroy
pdestroyed 组件销毁后 组件销毁后调用,此时只剩下dom空壳

七,slot是什么?并说一下详细的用法?

这里边都是vue2.0的slot插槽的知识。3.0更新了

vue官网解释:slot 插槽,-------(Vue 实现了一套内容分发的 API,这套 API 基于当前的 Web Components 规范草案,将 元素作为承载分发内容的出口。
)是不是看完稀里糊涂的,反正我是稀里糊涂的,再来说说我自己的理解:
slot就是为了实现真正的灵活的单页组件,在组件外部灵活控制组件内部的内容一种形式或者是入口,就是将组件内所需要的内容以插槽(slot)的形式插入到公共组件中,以达到灵活控制。
当组件渲染的时候,这个 元素将会被替换为“Your Profile”。插槽内可以包含任何模板代码,包括 HTML:详情请看vue 带动画效果的NavBar这里边有详细介绍到的使用方法。


这里边是3.0的slot插槽的内容 

1, vue 3.0将插槽当做了一个标签
2, 定义一个插槽


3, 向插槽内分发内容也可以写为