- vue组件的data为什么必须是函数?
因为是对象会共享
- 监听data变化的核心api是?
object.defineProperty()
- 使用Object.defineProperty()的缺陷?
对象新增属性和通过下标修改数组和修改数组长度时,视图不更新;vue提供了vue.set()方法解决这个问题;
- 原因是:vue在初始化的时候监听所有data上的对象,设置getter和setter;后来的不行
- 描述响应式原理:
- 当一个Vue实例创建时,vue会遍历data选项的属性
- 用 Object.defineProperty 将它们转为 getter/setter,在属性被访问和修改时通知变化。
- 每个组件实例都有相应的 watcher 程序实例,当data发生变化时,之后setter 被调用,会通知 watcher 重新计算,从而执行render函数,致使它关联的组件得以更新。
- 实例挂载过程中都发生了什么?
创建实例,选项合并,生命周期调用,数据劫持,属性方法初始化 ,created, 模版编译,生成render函数,生成虚拟树,diff算法对比差异,生成真实dom树,挂载到指定dom上,生命周期mounted
- 什么是虚拟dom
js对象,描述真实dom的类型,属性名,子节点等
- 为什么使用虚拟dom
减少重排重绘引起的性能问题;因为diff算法可以最小化的更新真实dom
- 简述vue的diff 算法, 复杂度 o(n)
流程:修改数据 -> 触发setter -> 通知所有订阅者 --> 调用patch方法 patch方法
- 同层比较
- 首位指针
- 旧地复用
- 不是同类型:直接替换
- 是同类型:就判断新旧是否相等,相等直接返回
- 不相等:分为5种情况:(重要)
- 文本直接替换。
- 子节点比较:新的有,旧的没有,添加
- 子节点比较:新的没有,旧的有,删除
- 都有子节点:首尾指针比较
- 前4个都不符合,用key去查找
- 为什么要在v-for中使用key
默认是旧地复用,使用key后可以更精准高效
- 什么是spa
单页应用,一种设计模式;一次性加载所有资源;动态更新页面内容,局部更新;通过路由机制可以实现多页应用的效果;首屏加载慢, seo难度大
- 解决spa首屏慢的方式有哪些?
使用ssr、路由懒加载、webpack启动gzip、第三方组件按需加载、减少请求次数、使用缓存、webpack配置不要重复打包
- vue 常见优化性能手段
- 合理使用v-if和v-show
- 合理使用computed
- v-for加key,以及避免和v-if同时使用(v-for比v-if的优先级高,所以每次都要v-for之后再v-if,所以避免使用)
- 自定义事件,DOM事件,定时即使销毁
- 合理使用异步组件
- 合理使用keep-alive(对需要进行缓存的时候keep-alive)
- data层级不要太深
- webpack层面的性能优化
- vue中 v-if 和v-for 哪个优先级更高
v-for
- vue 组件间通讯方式
- props + $emit ;
- eventbus时间总线;
- attrs + listeners;
- provide+inject;
- vuex;
- parents || $root 根组件(在main.js 中的data中返回一个vm实例