vue的diff算法?
创始人
2025-05-29 04:15:33

文章目录

  • 是什么
      • 比较方式
      • 原理分析
      • Diff算法的步骤:
      • 首尾指针法
      • 比对顺序:


是什么

diff 算法是一种通过同层的树节点进行比较的高效算法
其有两个特点:

比较只会在同层级进行, 不会跨层级比较
在diff比较的过程中,循环从两边向中间比较

比较方式

diff整体策略为:深度优先,同层比较

  • 比较只会在同层级进行, 不会跨层级比较
  • 比较的过程中,循环从两边向中间收拢

原理分析

在这里插入图片描述

Diff算法的步骤:

之后判断新旧两个节点是否为同类标签,如果不是同类标签就直接替换;如果是同类标签的话,进一步执行patchVnode()方法,在这个方法内部,也是需要先判断一下新旧虚拟节点是否相同,如果相等,就直接return;如果不相等就需要分情况来比对,比对的原则就是以新虚拟节点的结果为准,分为以下几种情况:

oldvnode和newvnode都有文本节点—执行—>用新的文本节点替换旧文本节点
oldvnode没有子节点,newvnode有子节点—执行—>添加新的子节点
oldvnode有子节点,newvnode没有子节点—执行—>删除旧的子节点
oldvnode和newvnode都有子节点—执行—>updateChildren()方法

首尾指针法

    ①依次比对,当比较成功后退出当前比较②渲染结构以newVnode为准③每次比较成功之后start点和end点向中间靠拢④当新旧节点中有一个start点跑到end点右侧时终止比较⑤如果都匹配不到,则旧虚拟DOM key只去比对新虚拟DOM的key值,如果key相同则复用,并移动到新虚拟DOM的位置

比对顺序:

  • 首先,旧虚拟节点的start和新虚拟节点的start做比对,如果没有比对成功,就用旧虚拟节点的start和新虚拟节点的end做比对。

  • 如果依旧没有比对成功,就用旧虚拟节点的end和新虚拟节点的start做比对,如果依旧没有比对成功,旧虚拟节点的end会和新虚拟节点的end做比对

  • 当比对成功,就退出当前比对,渲染结果会以新虚拟节点的结果为准

  • 每次比对成功后,比对成功的start会向右侧移动,end会向左侧移动。在移动的过程中,当start点跑到end点右侧的时候就终止比较。

相关内容

热门资讯

闲逛山东济南大明湖,看夏雨荷的... 朋友说去济南一定要看大明湖。我笑了,谁不知道那句“皇上,您还记得大明湖畔的夏雨荷吗”?但真正站在湖边...
走进这里,仿佛拥有整个世界 “看前头,嘎隆拉隧道到了!”唐师傅在驾驶座上高喊,我听后心里一颤:嘎隆拉,十多年来,这个让我心心念念...
“丝路巴楚 胡杨之都”新疆巴楚... “有人说喀什是一幅名画,叹为观止;有人说喀什是一席盛宴,回味无穷……”12月18日上午,伴随着新疆喀...
抗炎饮食为什么突然火爆?全谷物... 💬 你是否曾感到无缘无故的疲惫,或者身体时常出现不适?这可能与慢性炎症有关。慢性炎症被称为“隐形杀手...
原创 汾... 三季度营收89.60亿元,同比增长4.05%;净利润28.99亿元,同比下降1.38%——这是山西汾...