zoukankan      html  css  js  c++  java
  • 🍖Vue 虚拟DOM与Diff算法简介

    一.虚拟 DOM (Virtual Dom)

    vue2.0加入了virtual dom

    1.为什么要使用虚拟DOM

    • DOM很慢, 当创建一个元素比如div,有以下几项内容需要实现: HTML elementElementGlobalEventHandler
    • 简单的说,就是插入一个Dom元素的时候,这个元素上本身或者继承很多属性如 width、height、offsetHeight、style、title
    • 另外还需要注册这个元素的诸多方法,比如onfucos、onclick等等
    • 这还只是一个元素,如果元素比较多的时候,还涉及到嵌套,那么元素的属性和方法等等就会很多,效率很低

    2.虚拟 DOM 实现原理

    • 所谓的virtual dom,也就是虚拟节点
    • 它通过JS的Object对象模拟DOM中的节点,然后再通过特定的render方法将其渲染成真实的DOM节点
    • dom diff 则是通过JS层面的计算,返回一个patch对象,即补丁对象,在通过特定的操作解析patch对象,完成页面的重新渲染

    3.虚拟 DOM 数据渲染图

    11asdaskkkkkk

    4.实现步骤

    • 用JavaScript对象结构表示DOM树的结构;然后用这个树构建一个真正的DOM树,插到文档当中
    • 当状态变更的时候,重新构造一棵新的对象树; 然后用新的树和旧的树进行比较,记录两棵树
      差异
    • 把2所记录的差异应用到步骤1所构建的真正的DOM树上,视图就更新了

    5.小结

    • Virtual DOM本质上就是在JS和DOM之间做了一个缓存,, 可以类比CPU和硬盘
    • 既然硬盘这么慢,我们就在它们之间加个缓存; 既然DOM这么慢, 我们就在它们JS和DOM之间加个缓存
    • JS(CPU)只操作Virtual DOM(内存), 最后的时候再把变更写入硬盘(DOM)

    二.diff 算法

    1.原理

    • 比较两颗DOM数的差异是 Virtual DOM 算法中最为核心的部分,这也就是所谓的 Virtual DOM 的 diff算法
    • 简单的说就是新旧虚拟DOM 的比较, 如果有差异就以新的为准, 然后再插入的真实的DOM中, 重新渲染

    2.比较后出现的情况

    • 两个树的完全的 diff算法 是一个时间复杂度为 O(n3) 的问题; 但是在前端中, 你会很少跨层地移动DOM元素, 所以真实的DOM算法会对同一个层级的元素进行对比
    • 比较后的情况 :
    1、此节点是否被移除 -> 添加新的节点 
    2、属性是否被改变   -> 旧属性改为新属性
    3、文本内容被改变   -> 旧内容改为新内容
    4、节点要被整个替换 -> 结构完全不相同,移除整个替换
    

    参考 : simple小前端

    三.KEY的作用

    无论是vue或者react,但我们遍历数组生成dom元素的时候,都会建议我们给每一个dom元素加上key值,而且key值最好用每一项的唯一id,而不用index值(索引)

    1.key 的作用

    • key值的作用,其实是:追踪列表中哪些元素被添加、被修改、被移除的辅助标志
    • 通俗点来说,就是他可以帮助我们快速对比两个虚拟dom对象,找到虚拟dom对象被修改的元素
    • 然后仅仅替换掉被修改的元素,然后再生成新的真实dom

    2.原理讲解

    • 如果没有key值,就会根据就地复用的原则,一个一个对比,然后修改渲染
    • 如果key值用index(索引),假如我在数组中间插入一项的时候,此时从这一项开始的key值就全部都变了,都需要重新对比渲染
    • 如果有key,diff算法就可以通过对比找到正确的位置插入新节点,而key值相同的dom节点就不要去比较
  • 相关阅读:
    Java学习之分支结构---判断语句:if语句和switch语句
    CSS知识点之字体大小属性font-size
    CSS小知识点一
    loadRunner之参数化,对用户名和密码进行参数化,并打印输出---实际操作:用户登录的账号用随机值来登录
    LoadRunner 场景运行error的几种情况
    loadrunner使用随机值
    loadrunner报错-持续更新
    关联及web_reg_save_param
    jenkins 提示No emails were triggered
    环境部署(八):jenkins配置邮件通知
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14730492.html
Copyright © 2011-2022 走看看