美文网首页
Snabbdom Diff 算法的执行过程

Snabbdom Diff 算法的执行过程

作者: 翔子丶 | 来源:发表于2021-03-12 17:17 被阅读0次

Diff 算法执行过程:

在比较开始时首先对新老节点数组的开始和结尾节点设置标记索引,遍历比较时会出现四种情况

  1. oldStartVnode/newStartVnode 比较

  2. oldEndVnode/newEndVnode 比较

  3. oldStartVnode/newEndVnode 比较

  4. oldEndVnode/newStartVnode 比较

image-20210228165945045.png
  • 开始节点和结束节点,对应情况 1 和 2

    如果新旧节点是 sameVnode(key 和 sel 相同),则调用 patchVnode()对比和更新节点,并将新开始和旧开始索引往后移动 oldStartIdx++/newStartIdx++,再进行比较

image-20210228171242986.png
  • 旧开始节点和新结束节点,对应 3

    比较这两个节点,如果是 sameVnode,调用 patchVnode()对比和更新元素,并将 oldStartVnode 旧元素移动到最后,并更新索引

image-20210228171352435.png
  • 旧开始节点和新结束节点,对应 4

    比较这两个节点,如果是 sameVnode,调用 patchVnode()对比和更新元素,并将 oldEndVnode 旧元素移动到开始位置,并更新索引

image-20210228171655490.png
  • 非以上四种情况,说明开始和结束节点都不相同

    遍历新节点,使用 newStartVnode 的 key 查找是否有相同的节点

    如果没有,说明 newStartVnode 是新节点,创建新 DOM 元素,插入到 DOM 树种

    如果有,判断新旧节点的 sel 属性是否相同,如果是则将旧节点赋值给 elmToMove 变量,并调用 patchVnode 对比和更新节点差异,最后将 elmToMove 对应的 DOM 移动到最前面;如果不是,说明节点被修改了,重新创建对应的 DOM 元素,插入到 DOM 树中

    移动新节点索引,继续循环遍历

    遍历结束,会出现两种情况

    • 旧节点的子节点个数小于新节点的子节点个数,旧节点先遍历完(oldStartIdx > oldEndIdx),循环结束

      此时新节点有剩余,把剩余节点批量插入到右边

image-20210228173229550.png
*   旧节点的子节点个数大于新节点的子节点个数,新节点先遍历完(newStartIdx > newEndIdx),循环结束

    此时旧节点有剩余,把剩余节点批量删除
image-20210228173532921.png

相关文章

  • Snabbdom Diff 算法的执行过程

    Diff 算法执行过程: 在比较开始时首先对新老节点数组的开始和结尾节点设置标记索引,遍历比较时会出现四种情况 o...

  • Vue之虚拟DOM和diff算法

    首先介绍一下snabbdom,snabbdom是著名的虚拟DOM库,是diff算法的鼻祖,Vue源码借鉴了snab...

  • Snabbdom:虚拟DOM和Diff算法

    因为要学习Vue源码,它的diff算法是绕不过的一个知识点。学习过程中,有了解到 Snabbdom 这个库,Vue...

  • vue2-snabbdom-diff算法

    最近学了一下snabbdom的diff算法,记录一下 由于是简易版所有h函数只接受三种形式, 第三个参数只能是文字...

  • Vue中的diff算法

    Vue中的diff算法 概念:diff算法是一种优化手段,将前后两个模块进行差异化对比,修补(更新)差异的过程叫做...

  • Vue中的diff算法

    Vue中的diff算法 概念:diff算法是一种优化手段,将前后两个模块进行差异化对比,修补(更新)差异的过程叫做...

  • 你怎么理解vue中的diff算法

    diff算法不是vue专用 必要性,lifecycle.js - mountComponent() 执行方式,pa...

  • React diff算法

    传统的diff算法复杂度是O(n*3),而React diff算法改进了传统的diff算法,将算法复杂度降低到了O...

  • VueDiff算法的简单分析和一些个人思考

    Diff算法是Vue视图动态改变的核心算法之一 本文包括对Diff算法的简单概括,和我闲的难受对Diff算法的一些...

  • sammary

    vue-diff算法 react 性能优化 diff算法 ,局部更新DOMshouldComponentUpdat...

网友评论

      本文标题:Snabbdom Diff 算法的执行过程

      本文链接:https://www.haomeiwen.com/subject/ocvzqltx.html