1.vue2和vue3响应式数据的理解
响应式:就是数据的改变,对应的视图也会改变
vue2:是通过object.defineProperty()进行数据劫持,如果是多层次的对象就要递归
vue3:采用proxy,如果是多层次数据,用户不使用就不会递归
2.vue2中是如何检测数组变化的
vue2中没有使用defineProperty对这个数组的每一项进行拦截,而是选择重写数组方法
数组中如果是对象的数据类型,也进行递归处理
数组的索引和长度变化是无法监控的
3.vue中如何进行依赖收集
每一个属性都有一个dep,存放所依赖的watcher,当属性变化后通知自己对应的watcher去更新
默认在渲染的时候(获取这个响应式数据),此时就会触发属性收集依赖dep.depend()
当属性发生改变时触发watcher,通过dep.notify()
data属性=>> dep=>
在页面上使用=>watcher
4.nextTick原理?在哪使用?
使用nextTick中的回调函数在下一次dom更新循环结束之后,执行回调
用于获取更新后的dom
vue中的数据更新是异步的,使用nextTick方法可以保证用户定义的逻辑在更新之后执行
5.vue为什么需要使用虚拟dom
如果我们直接操作真实的dom 性能低
虚拟dom就是一个js对象,也可以理解为真实dom的抽象
6.vue中diff算法原理
vue2:递归+双指针
判断是不是同一个元素,不是同一个元素,直接替换
是同一个元素=》比对属性=》比对儿子(1老的有儿子,新的没有儿子 2新的有儿子,老的没有 3都是文本的情况 4都有儿子)=》双指针:头头,尾尾,头尾,尾头=》对比查找后进行复用
vue3:采用最长递增子序列
7.请说明vue中key作用原理
vue中在patch过程中通过key可以判断两个虚拟节点是否相同(可以复用老的节点)
没有key导致更新的时候出错
8.作用域和作用域链
作用域:就是一个规则,用来查找变量
作用域链:多层嵌套作用域
9.闭包
概念:函数中返回一个函数 函数的声明的作用域和函数使用的作用域不同
用途1:获取私有作用域中的变量
用途2:这些变量可以保存到内存中
例子:
function a(){
let n=0//保存到内存中
function add(){
n++
return n
}
return add
}
let getN = a()
console.log(getN()) //1
console.log(getN()) //2
10.实现防抖
防抖:用户多次点击按钮浪费性能
11.