vue面试题

1.响应式数据的原理
理解:
(1)核心点:Object.defineProperty
(2)默认vue在初始化数据时,会给data中的属性使用Object.defineProperty重新定义所有的属性,当页面取到对应属性时,会进行依赖收集(收集当前组件的watcher)如果属性发生变化会通知相关依赖进行更新操作。

2.vue中如何检测数组的变化
理解:
(1)使用函数劫持的方式,重写了数组的方法
(2)vue将data中的数据,进行原型链重写。指向了自己定义的数组原型方法,这样当调用数组api时,就可以通知相关依赖更新,如果数组中包含着引用类型。会对数组中的引用类型再次进行监控。

3.为何vue采用异步渲染
理解:
因为如果不采用异步更新,那么每次更新数据都会对当前组件进行重新渲染,所以为了性能考虑,vue会在本轮数据更新后,再去异步更新视图。

4.nextTick实现原理
理解:
nextTick方法主要是使用了宏任务和微任务,定义了一个异步方法。多次调用nextTick会将方法存入队列中,通过这个异步方法清空当前队列。所以这个nextTick方法就是异步方法。

5.vue中computed的特点
理解:
默认computed也是一个watcher是具备缓存的,只要当依赖的属性发生变化时才更新视图。

6.watch中的deep:true是如何实现的
理解:
当用户指定了watch中的deep属性为true时,如果当前监控的值是数组类型。会对对象中的每一项进行求值,此时会将当前watcher存入到对应属性的依赖中,这样数组中对象发生变化时也会通知数据更新。

7.vue组件的生命周期
理解:
什么时候被调用
beforeCreate:在实例初始化之后,数据观测(data observer)之前被调用
created:实例化已经创建完成后被调用。在这一步,实例已经完成以下的配置:数据观测(data observer),属性和方法的运算,watch/event事件回调,这里没有 $ el
beforeMount:在挂载开始之前被调用:相关的render函数首次被调用
mounted:el被新创建的vm.$el替换,并挂载到实例上去之后调用该钩子
beforeUpdate:数据更新时调用,发生在虚拟dom重新渲染和打补丁之前
updated:由于数据更改导致的虚拟dom重新渲染和打补丁,在这之后会调用该钩子
beforeDestory:实例销毁之前调用。在这一步,实例仍可完全可用
destoryed:vue实例销毁后调用,调用后vue实例指示的所有东西都会解绑定,所有的事件监听器都会被移除,所有的子实例也会被销毁。该钩子在服务端渲染期间不被调用。

可以做什么事
created 实例化已经创建完成,因为它是最早触发的原因,可以请求一些数据,资源的请求
mounted 实例已经挂载完成,可以进行一些dom操作
beforeUpdate 可以在这个钩子函数中进一步的更改状态,这不会触发附加的重渲染过程
updated 可以执行依赖于dom的操作,然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务端渲染期间不可调用
destoryed:可以执行一些优化操作,清空定时器,解除绑定事件

你可能感兴趣的:(vue面试题)