Vue 面试题(简单版)

78 阅读3分钟
  1. vue组件的data为什么必须是函数?

因为是对象会共享

  1. 监听data变化的核心api是?

object.defineProperty()

  1. 使用Object.defineProperty()的缺陷?

对象新增属性和通过下标修改数组修改数组长度时,视图不更新;vue提供了vue.set()方法解决这个问题;

  • 原因是:vue在初始化的时候监听所有data上的对象,设置getter和setter;后来的不行
  1. 描述响应式原理:
  • 当一个Vue实例创建时,vue会遍历data选项的属性
  • 用 Object.defineProperty 将它们转为 getter/setter,在属性被访问和修改时通知变化。
  • 每个组件实例都有相应的 watcher 程序实例,当data发生变化时,之后setter 被调用,会通知 watcher 重新计算,从而执行render函数,致使它关联的组件得以更新。
  1. 实例挂载过程中都发生了什么?

创建实例,选项合并,生命周期调用,数据劫持,属性方法初始化 ,created, 模版编译,生成render函数,生成虚拟树,diff算法对比差异,生成真实dom树,挂载到指定dom上,生命周期mounted

  1. 什么是虚拟dom

js对象,描述真实dom的类型,属性名,子节点等

  1. 为什么使用虚拟dom

减少重排重绘引起的性能问题;因为diff算法可以最小化的更新真实dom

  1. 简述vue的diff 算法, 复杂度 o(n)

流程:修改数据 -> 触发setter -> 通知所有订阅者 --> 调用patch方法 patch方法

  • 同层比较
  • 首位指针
  • 旧地复用
  • 不是同类型:直接替换
  • 是同类型:就判断新旧是否相等,相等直接返回
  • 不相等:分为5种情况:(重要)
      1. 文本直接替换。
      1. 子节点比较:新的有,旧的没有,添加
      1. 子节点比较:新的没有,旧的有,删除
      1. 都有子节点:首尾指针比较
      1. 前4个都不符合,用key去查找
  1. 为什么要在v-for中使用key

默认是旧地复用,使用key后可以更精准高效

  1. 什么是spa

单页应用,一种设计模式;一次性加载所有资源;动态更新页面内容,局部更新;通过路由机制可以实现多页应用的效果;首屏加载慢, seo难度大

  1. 解决spa首屏慢的方式有哪些?

使用ssr、路由懒加载、webpack启动gzip、第三方组件按需加载、减少请求次数、使用缓存、webpack配置不要重复打包

  1. 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层面的性能优化
  1. vue中 v-if 和v-for 哪个优先级更高

v-for

  1. vue 组件间通讯方式
  • props + $emit ;
  • eventbus时间总线;
  • attrs + listeners;
  • provide+inject;
  • vuex;
  • parents || $root 根组件(在main.js 中的data中返回一个vm实例