Vue响应式原理、虚拟DOM和DIFF算法、模板编译--Vue原理

一、Vue响应式原理

 1、什么叫响应式:

  1、组件data的数据一旦变化,立刻出发视图的更新

  2、实现数据驱动视图的第一步

2、实现响应式的核心API:Object.defineProperty  vue3.0利用 proxy实现响应式

3、Object.defineProperty 基础用法(通过get set 用法来实现)--能讲到这里就OK了

4、Object.defineProperty 实现响应式

  1、监听对象、监听数组
  2、复杂对象,深度监听
   3、几个缺点

二、虚拟DOM和DIFF算法

虚拟DOM也称VDOM

  VDOM是Vue react的基石;Vue和react 是数据驱动视图,那么如何有效操控DOM操作,VDOM就出来了;

VDOM原理:因为js的执行速度是非常快的,所以VDOM就是用JS模拟DOM结构,计算出最小的变更(这个对比算法就是DIFF),操作DOM;

DOM结构可以用JSON模拟出来,类似XML;下图需要能写出来

学习VDOM利用 snabbdom

  1、DIFF算法例如 v-for 的key为什么必须要;就讲讲DIFF算法

DIFF比较算法

  1、只比较同一层级,不跨级比较

  2、tag不相同,则这接删掉重建,不在深度比较

  3、tag和key,两者都相同,则认为是相同节点,不在深度比较

DIFF源码的核心

  1、pathVnode

  2、addVnodes removeVnodes

  3、updateChildren(key的重要性)

三、模板编译(通过考察”组件渲染和更新过程“)

1、什么叫模板编译:

  (a)、Vue模板不是HTML;直接浏览器打开是不识别的了;模板是有指令,插值、JS表达式、能判断、循环

  (b)、HTML是标签语言,只有JS才能实现判断、循环

  (c)、因此,模板一定是转换为某种JS代码,即编译模板

2、模板编译过程

  (a)、首先vue template complier将模板编译为render函数

  (b)、执行 rendera 函数生成 vnode

  (c)、vnode就是虚拟DOM结构,然后编译(vue组件可以用render代替template,react一直用的都是render)

3、一个组件渲染到页面,修改DATA出发更新(数据驱动视图),背后原理,需要掌握什么

  (a)、首先响应式,通过get、set 监听数据

  (b)、模板编译,生成 vnode

  (c)、vnode的执行

四、VUE的渲染过程

  1、初次渲染

    (a)、解析模板为render函数(在开发环境已经完成,v-loader)

    (b)、出发响应式,监听data 属性 getter setter

    (c)、执行render函数,生成 vnode ,patch渲染

  2、数据更新

    (a)、修改data,触发setter

    (b)、重新生成render函数,生成newVnode

    (c)、patch (vnode、newVnode,diff算法计算)

  3、异步渲染

    (a)、汇总data的修改,一次性更新视图

    (b)、减少DOM操作次数,提高性能

五、前端路由

  hash的特定

    1、hash 变化会触发网页跳转,即浏览器的前进、后退

    2、hash 变化不会刷新页面

    3、hash 永远不会提交到 server 端

  history

    1、用Url规范的路由,但跳转不刷新页面

    2、history.pushState

    3、需要后端支持

六、总结一点面试题

1、为什么组件data必须是一个函数

  A:必须是一个函数。因为 .vue 组件编译完之后 其实是一个类,每次使用的时候都是类实例化,所以data必须是一个函数;

2、ajax请求放在哪个声明周期

  A: 放在mounted里面,因为这里页面已经渲染完成,并且JS是单线程的,ajax是异步获取数据,所以放在这里

3、何时需要使用 beforeDestory

  A、解除自定义事件 event.$off

  B、清除定时器

  C、解绑自定义的 DOM 事件,入 window scroll等

4、vuex中action 和 mutation 有何区别

  A、action 中处理异步,mutation 不可以

  B、mutation做原子操作

  C、action可以整合多个mutation

5、vnode描述一个DOM结构

6、Vue常见性能优化

  A、合理使用v-show v-if

  B、合理使用 computed

  C、v-for加key,以及避免 和 v-if 同时使用

  D、自定义事件、DOM事件及时销毁

  E、合理使用异步组件

  F、合理使用keep-alive

  G、预编译 vueloader

原文地址:https://www.cnblogs.com/haonanZhang/p/12559652.html