Vue常用面试知识点汇总

298 阅读7分钟

1.vue的核心是什么?

数据驱动,组件化,虚拟dom

2.说一下你对mvvm,mvc的理解?

Model:代表数据模型
View(视图层):数据的可视化
ViewModel(业务逻辑层):同步view和model的对象

在mvvm模式下,view和model之间是没有直接的联系,而是通过viewModel进行交互,model和ViewModel是双向绑定的,当model中的数据改变时会立即反应到view,视图发生变化的时候数据的变化也会同步到model

在mvc模式下,View传送数据到Controller。Model是功能模型将新数据发送到view。Controller是View和Model的桥接,将View的输入传递到Model,Model将结果反馈到View。

MVC特点:所有通信都是单向的。
View 传送指令到 Controller;
Controller 完成业务逻辑后,要求 Model 改变状态;
Model 将新的数据发送到 View,用户得到反馈。

MVVM 特点:
各部分之间的通信,都是双向的;
采用双向绑定: View 的变动,自动反映在ViewModel,反之亦然,好处低耦合,可重用性,独立开发

3.vue双向绑定的原理(同数据响应的原理)?

vue实现数据双向绑定采用:数据劫持 + 发布者-订阅者模式。 通过Object.defineProperty()来劫持各个属性的getter,setter.在数据变化时发布消息给订阅者,触发对应监听的回调。

1.实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者。

2.实现一个订阅者Watcher,可以收到属性的变化通知并执行相应的函数,从而更新视图。

3.实现一个解析器Compile,可以扫描和解析每个节点的相关指令,并根据初始化模板数据以及初始化相应的订阅器

4.Vue的生命周期

所谓的生命周期是指,组件实例从开始创建、初始化数据,编译模版,挂载Dom,渲染,更新渲染,销毁的过程。

生命周期:

beforeCreate:创建前Vue实例的挂载元素el和数据对象data都为undefined
created:数据初始化完成,挂载元素el为undefined
beforeMount:挂载元素初始化完成,未挂载虚拟dom替换真实数据
mounted: 挂载完成,页面及数据渲染完成
beforeUpdate: 重新渲染之前触发。
updated: 数据已经更改完成,DOM 也重新 render 完成,更改数据会陷入死循环
beforeDestroy: 销毁前执行(实例仍然完全可用)
destroyed: 销毁后执行(实例不可用)

第一次页面加载时会触发:beforeCreate、created、beforeMount、mounted

5.常用修饰符

1.按键修饰符:
如:.delete(捕获“删除”和”退格“键)      用法上和事件修饰符一样,挂载在v-on:后面,语法:v-on:keyup.xxx=’yyy’  <inputclass = 'aaa' v-model="inputValue" @keyup.delete="onKey"/>

2.系统修饰符:
触发鼠标或键盘事件的监听器:.ctrl .alt .shift .meta

3.鼠标按钮修饰符
.left .right .middle 这些修饰符会限制处理函数仅响应特定的鼠标按钮。如:<button @click.middle ="onClick">A</button>  鼠标滚轮单击触发   Click默认是鼠标左键单击

4.其他修饰符
.lazy 在默认情况下,v-model 在每次 input 事件触发后将输入框的值与数据进行同步:<input v-model.lazy="msg" >
.number 如果想自动将用户的输入值转为数值类型,<input v-model.number="age" type="number">
.trim 过滤用户输入的首尾空白字符 <inputv-model.trim="msg">

5、说说vue的动态组件。 多个组件通过同一个挂载点进行组件的切换,is的值是哪个组件的名称,那么页面就会显示哪个组件。 主要考查面试这 component的 is属性。

6、route和router的区别是什么?

$router为VueRouter的实例,是一个全局路由对象,包含了路由跳转的方法、钩子函数等。

$route 是路由信息对象,每一个路由都会有一个route对象,是一个局部对象,包含path,params,hash,query,fullPath,matched,name等路由信息参数。

7、vueRouter引用方式及传参方式

模版引用:
<router-link to="/foo"></router-link>
<router-view></router-view> 

路由跳转:
1.使用params,参数不会显示在路径,强制刷新会清空参数,只能使用name
this.$router.push({
    name: 'Home',
    params: {
        number: 1
    }
})
2.使用query,参数显示在路径,刷新不清空,name可以使用path路径
this.$router.push({
    name: 'Home',
    query: {
        number: 2
    }
})

8、Vue 组件 data 为什么必须是函数

因为 JS 本身的特性带来的,如果 data 是一个对象,那么由于对象本身属于引用类型,当我们修改其中的一个属性时,会影响到所有 Vue 实例的数据。如果将 data 作为一个函数返回一个对象,那么每一个实例的 data 属性都是独立的,不会相互影响了。

9、计算属性 computed 和事件 methods 有什么区别

computed:计算属性是基于它们的依赖进行缓存的,只有在它的相关依赖发生改变时才会重新求值。
method:只要发生重新渲染, method 调用总会执行该函数。

10、 Vue 中 key 的作用

1.key的特殊 attribute 主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes。如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地修改/复用相同类型元素的算法。而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在的元素。有相同父元素的子元素必须有独特的 key。重复的 key 会造成渲染错误。

2.它也可以用于强制替换元素/组件而不是重复使用它。当你遇到如下场景时它可能会很有用:
    完整地触发组件的生命周期钩子
    触发过渡

11、VUE中虚拟DOM的理解?

虚拟DOM的作用:
    1.最终目标是将虚拟节点渲染到视图上。但是如果直接使用虚拟节点覆盖旧节点的话,会有很多不必要的DOM操作。例如,一个ul标签下很多个li标签,其中只有一个li有变化,这种情况下如果使用新的ul去替代旧的ul,因为这些不必要的DOM操作而造成了性能上的浪费。
    2.为了避免不必要的DOM操作,虚拟DOM在虚拟节点映射到视图的过程中,将虚拟节点与上一次渲染视图所使用的旧虚拟节点(oldVnode)做对比,找出真正需要更新的节点来进行DOM操作,从而避免操作其他无需改动的DOM
    3.其实虚拟DOM在Vue.js主要做了两件事:
    提供与真实DOM节点所对应的虚拟节点vnode;
    将虚拟节点vnode和旧虚拟节点oldVnode进行对比,然后更新视图
为何需要Virtual DOM?
    1.具备跨平台的优势
    由于 Virtual DOM 是以 JavaScript 对象为基础而不依赖真实平台环境,所以使它具有了跨平台的能力,比如说浏览器平台、Weex、Node 等。
    2.操作 DOM 慢,js运行效率高。我们可以将DOM对比操作放在JS层,提高效率。
    因为DOM操作的执行速度远不如Javascript的运算速度快,因此,把大量的DOM操作搬运到Javascript中,运用patching算法来计算出真正需要更新的节点,最大限度地减少DOM操作,从而显著提高性能。
    Virtual DOM 本质上就是在 JS 和 DOM 之间做了一个缓存。可以类比 CPU 和硬盘,既然硬盘这么慢,我们就在它们之间加个缓存:既然 DOM 这么慢,我们就在它们 JS 和 DOM 之间加个缓存。CPU(JS)只操作内存(Virtual DOM),最后的时候再把变更写入硬盘(DOM)
    3.提升渲染性能
    Virtual DOM的优势不在于单次的操作,而是在大量、频繁的数据更新下,能够对视图进行合理、高效的更新。
    为了实现高效的DOM操作,一套高效的虚拟DOM diff算法显得很有必要。我们通过patch 的核心----diff 算法,找出本次DOM需要更新的节点来更新,其他的不更新。比如修改某个model 100次,从1加到100,那么有了Virtual DOM的缓存之后,只会把最后一次修改patch到view上。那diff 算法的实现过程是怎样的?