当前位置: 首页 > Web前端 > vue.js

Vue框架虚拟DOM与diff算法

时间:2023-04-01 10:30:17 vue.js

一、diff算法的由来我们都知道Vue是由数据驱动的。数据变化后,它不会像jQuery那样渲染页面的所有节点,而是渲染局部节点,如何判断哪个节点变化了?使用的是虚拟DOM和真实DOM的比较,比较的方法是diff算法。2、虚拟DOM(virtualDOM)是怎么回事为了查看节点变化,用JS将DOM元素变成对象。内部结构和DOM编号是同一个DOM元素:

Iamtext

虚拟DOM对象:h2',text:'我是文本'}]};如果DOM元素发生变化,比如子元素由h2标签变成了p标签,

我是文本

letnewVnode={tag:'div',children:[{tag:'p',text:'IamText'}]};我们可以直接比较oldVnode和newVnode这两个变量。3、diff比较原理比较原理1:逐层比较,第一层不同,直接替换;比较...比较原则2:从两侧到中间,从头到尾比较新旧元素的子节点。如果相同,则放在新元素对应的位置;四个类别中的第一类,第一层(最外层)不同,则直接替换旧元素,最外层的div

我是文字

新元素,最外层p

我是text

这种情况就不用比较了,直接替换即可。(PS:好像更新了最新的算法,最外层不一样了,所以你会发现第二种,外层元素一样,旧元素没有子节点,新元素有子节点,然后更新子节点,老元素,最外层div,没有子节点,光杆指挥官>新元素,最外层也是div,子节点p,直接创建p节点

I是第三种文本

,旧元素有子节点,新元素没有子节点,则删除旧子节点old元素,最外层div,子节点p

我是文字

</div>新建元素,最外层也是一个div,没有子节点。删除旧元素的子节点p。对比,将旧元素移到中间,最外层div,子节点p,span,h3,a

新建元素,最外层也是div,子节点p,a,div,h3,h5

/div>

你必须记住,diff算法只是一种比较手段,本质落脚点是新元素。说白了就是根据新元素的子节点,按照一定的规则去旧元素的子节点中查找有没有相同的,有没有重用的5.diff算法流程下面用这个例子来演示diff算法流程旧元素,最外层div,子节点p,span,h3,a

新建元素,最外层也是div,子节点p,a,div,h3,h5

为了比较方便,在old元素的子节点上加上前缀old,并在新元素的子节点上加上前缀New,即Old:Old_p,Old_span,Old_h3,Old_aNew:New_p,New_a,New_div,New_h3,New_h5开始比较,记住,每一轮都是两两比较old和new,落脚点是新元素的第一轮比较:NewheadVSoldhead:New_p和Old_p,结果都是p,所以新元素的第一个子节点p不需要重新创建,旧元素的p节点可以重用。NewheadVSoldtail:new_p和old_a不同,但是已经在旧元素中找到了相同的,即结论已经被复用:新元素的第一个节点,如果在第一个中找到相同的节点andlastnodesoftheoldelement,itcanreuse,nonewcreation,andnoparticipatingthesecondroundcomparisonwiththenewtailVSoldhead:New_h5和Old_p不同,新元素尾节点h5不能复用NewtailVSoldtail:New_h5和old_a不同,新元素tail节点h5不能复用结论:新元素tail节点,在旧元素的首尾节点中找不到相同的节点,所以不能复用.等待第二轮比对。old_h3,Old_anew:New_a,New_div,New_h3,New_h5newfirstVSoldfirst:New_aandOld_spannewfirstVSoldtail:New_aandOld_a结论:在old的第一个和最后一个节点中找到新元素的第一个节点元素。可以复用,不新建,不参与第三轮比对NewtailVSoldhead:New_h5andOld_spanNewtailVSoldtail:New_h5、old_a结论:新元素的尾节点在旧元素的首末节点中找不到,不能重用。等待第三轮比较。第三轮比较:此时的新旧元素及其子节点(New_p、New_a已经被复用,不参与比较)Old:Old_span、Old_h3New:New_div、New_h3、New_h5New_div、New_h3、New_h5NewfirstVSoldfirst:new_divandOld_spanNewfirstVSoldtail:New_divandOld_h3结论:新元素的第一个节点,在旧元素的第一个和最后一个节点中找不到相同的节点,不能重复使用。等待第四轮比较。找不到相同的,不能重用,等待第四轮比对注意,因为本轮没有匹配到可重用节点,准备等待第四轮比对,但是只有两个child为旧元素留下的节点,下一轮仍然是Nomatch,所以本轮结束后,直接创建首节点New_div和尾节点New_h5。第四轮比较:此时的新旧元素和子节点(New_p、New_a已经被重用,New_div、New_h5已经创建,全部不参与比较)Old:Old_span、Old_h3New:New_h3新元素只有New_h3,直接比较New_h3和Old_spanNew_h3和Old_h3结论:在旧元素的第一个和最后一个节点中找到相同的节点,可以重复使用,而不是在new创建时,新元素子节点都OK,而旧的元素子节点留有old_span,直接删除就可以了。至此,本例的diff算法就完成了。其实还有一种情况需要说明一下。如果某轮第4次比较都失败了,你应该在旧元素的子节点上寻找相同的key,这就是Vue要求添加key的原因。第六,diff算法的最终过程其实比本例更复杂,需要考虑的情况也更多。本文只是个人学习总结,如果对你有帮助,那很好。

最新推荐
猜你喜欢