zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    NHibernate介绍
    dwr配置文件dwr.xml详解
    架构设计师与SOA
    SOA是什么
    JDK常用命令
    在WPF的WebBrowser控件中抑制脚本错误
    通过编程计算一个游戏的胜率
    在C#中模拟大数乘法
    解决HttpWebRequest首次连接特别慢的问题
    布隆过滤器(Bloom Filter)
  • 原文地址:https://www.cnblogs.com/haonanZhang/p/12559652.html
Copyright © 2011-2022 走看看