- data为什么是一个函数而不是对象
答:因为组件是可以复用的,js里对象是引用关系,如果组件data是一个对象,那么子组件中的data属性值会互相污染,产生副作用。
因为函数有独立的作用域,所以一个组件的data选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝,new Vue的实例是不会被复用的,因此不存在以上问题
- Vue 中给 data 中的对象属性添加一个新的属性时会发生什么?如何解决?
答:不会添加上去
解决:因为一开始就设置成了响应式数据,新添加的数据没有通过object.defineproperty()设置成响应式数据
- Vue中封装的数组方法有哪些,其如何实现页面更新
答:方法:push(),pop(),unshift(),splice(),sort(),reverse()
页面更新:重写了数组中的那些原生方法,首先获取到这个数组的_ob_,也就是他的Observer对象,如果有新的值,就调用observeArray继续对新的值观察变化,然后手动调用notify,通知渲染watcher,执行update。
- vue初始化页面闪动问题
答:在vue初始化的时候,由于div是不归vue管的,在解析代码的时候会出现花屏现象,呈现出类似于{{text}}的字样。
我们可以通过[v-cloak]{display:none}来解决
- Vue3.0有什么更新
答:1.监测机制的改变:带来基于代理Proxy的observer实现
2.只能监测属性,不能监测对象
3.模板:把作用域插槽改成了函数的方式,提升了渲染的性能
4.对象式的组件声明方式
5.支持自定义渲染器
16.defineProperty和proxy的区别
答:defineProperty:添加或删除对象的属性时,vue检查不到,因为添加或删除的对象没有在初始化进行响应式处理,只能通过$set来调用Object.defineProperty()处理,无法监控到数组下标和长度的变化
Proxy:可以监听同级结构下的所以属性变化,包括新增属性和删除属性,可以监听数组的变化
17.Vue3.0 为什么要用 proxy?
答:在vue3.0中使用proxy实现了以下特点:
1.不需要使用vue.$set或vue.$delete触发响应式
2.全方位的数组变化检测,消除了vue2无效的边界情况
3.支持Map,set,weakMap和WeakSet
18.对虚拟DOM的理解?
答:他是一层对真实DOM的抽象,以JavaScript对象(VNdoe节点),作为基础的树,用对象的属性来描述节点,最终可以通过一系列操作使这颗树映射到真实的环境上
- 为什么要用虚拟DOM
答:因为DOM是很慢的,其元素是非常庞大的,页面的性能问题大部分是又DOM操作引起的,真实的DOM节点,哪怕一个最简单的div也包含着很多的属性,可以打印出来直观地感受一下操作DOM的代价是昂贵的,频繁操作还会出现页面卡顿,影响用户的体验
- DIFF算法的原理
答:在diff中,只对同层的子节点进行比较,放弃跨级的节点比较,使得复杂抵值,也就是说,只有当新旧children都为多个子节点时才需要用核心的Diff算法进行同级比较