Vue(知识点总结)

Vue

对Vue的理解

Vue 是一个构建数据驱动的渐进性框架,目标是通过API实现 响应数据绑定视图更新

Vue的两大核心

  • 数据驱动
  • 组件系统

    Vue生命周期

    Vue实例从创建到销毁的过程
    graph LR
    开始创建 --> 初始化数据-->编译模板-->挂载DOM-->渲染-->更新-->渲染;更新-->卸载

    生命周期的作用

    生命周期中有多个事件钩子,能让开发者在控制整个vue实例的过程时更容易形成良好的逻辑判断

    createdmounted

created mounted
调用时机 模板渲染成 HTML 前 模板渲染成 HTML 后
常见作用 初始化属性值,再渲染成视图 操作DOM节点

定时器

beforeDestroy()清除

clearInterval(this.timer);
this.timer = null;

v-model的使用

用于表单数据的双向绑定,其实是语法糖,背后做了两个操作:

  1. v-bind绑定value属性
  2. v-on绑定input事件

    Vue响应式(双向数据)原理

    通过 数据劫持 结合 发布订阅模式 的方式来实现

  3. Vue2:通过Object.defineProperty() 来劫持各个属性的setter、getter,在数据变动时发布消息给订阅者,触发相应的监听回调
  4. Vue3:仅仅是将数据劫持的方式由Object.defineProperty更改为ES6的Proxy代理

    Vue3相对Vue2的优化

  5. 双向数据绑定方面:
    Vue2的object.defineProperty一次只能劫持对象的单个属性,从而需要通过递归+遍历对每个对象的每个属性进行数据监控;如果属性值是对象的话,还需要深度遍历
    而Vue3.0中的proxy可以一次性地劫持对象的所有属性的setter、getter,还可以代理数组,也可以代理动态添加的属性,有13种劫持操作
  6. 性能方面快1.2~2倍:

(1) diff方法优化

vue2中的虚拟dom是全量的对比(每个节点不论写静态还是动态的都会比较)

vue3新增了静态标记(patchflag)与上次虚拟节点对比时,只对比带有patch flag的节点(动态数据所在的节点);可通过flag信息得知当前节点要对比的具体内容

(2) 静态提升

vue2无论元素是否参与更新,每次都会重新创建然后再渲染
vue3对于不参与更新的元素,会做静态提升,只会被创建一次,在渲染时直接复用即可

(3) 时间侦听器缓存

默认情况下onClick会被视为动态绑定,所以每次都会追踪它的变化

但是因为是同一个函数,所以不用追踪变化,直接缓存起来复用即可

(4) ssr渲染

  1. 按需编译,体积比vue2.x更小
  2. 组合API(类似react hooks)
  3. 更好的Ts支持
  4. 暴露了自定义渲染API
  5. 更先进的组件
  6. Fragment:模板可以有多个根元素

    虚拟DOM

    虚拟DOM相对于浏览器所渲染出来的真实 DOM,在 React,Vue 等技术出现之前, 改变页面展示内容只能遍历查询 DOM 树找到需要修改的 DOM,然后修改样式行为或者结构,来更新UI,但是这种方式相当消耗计算资源,每次查询DOM几乎都需要遍历整棵DOM树,因此建立一个与真实DOM树对应的虚拟DOM对象(JavaScript对象),以对象嵌套的方式来表示DOM树,那么每次DOM的更改就变成了对象属性的更改,这样一来就能通过diff算法查找变化要比查询真实的DOM树的性能开销小