这篇文章主要介绍“vue2的diff算法怎么使用”,在日常操作中,相信很多人在vue2的diff算法怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue2的diff算法怎么使用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!比较方式: 同级比较,不会跨级比较以下源码来自vue/patch.ts,会有一些提取,相关函数会附上链接。diff
过程就是调用 patch
函数,比较新旧节点,一边比较一边给真实DOM打补丁,那么我们就先来看一下patch
函数:源码地址: patch函数,isUndef()函数,isDef()函数, emptyNodeAt函数其中出现了sameNode
,判断是否值得我们去给他打补丁,不值得的话就按照上述步骤进行替换,我们还是去寻找一下这个函数源码地址: sameNode函数如果值得我们去给他打补丁,则进入我们patchVNode
函数源码地址: patchVNode函数这个函数有点长,也是做了一下删减这里的判断很多,所以我也加了个流程图源码地址:updateChildren函数这里采用四步走的形式,我把代码都拆分出来了采用的四个指针分别指向四个节点oldStartIdx
,newStartIdx
指向旧节点头,新节点头, 初始值为0oldEndIdx
, newEndIdx
指向旧节点尾,新节点尾,初始值为长度-1旧头和新头旧尾和新尾旧头和新尾旧尾和新头注意: 这里只要能够命中一个,就重开,都不能命中的话再看下一环节, 而不是继续挨个判断实践来一下,就拿上面随机来的例子吧step1 、step2step3 、step4(命中)在step4进行处理,移动节点到正确位置(插在旧头的前面)旧尾向左走,新头向右走处理完后就重开,从step1开始,到step2再次命中,此时oldEndInx
和newEndInx
齐头并进向左走(注意这里是不用去移动节点的哦)(左), 然后重开,在step2再次命中…(右)重开, 这次在step3命中,然后将旧头结点结点的真实节点插在旧尾结点的后面,到这里其实真实节点就已经是我们所期望的了上述处理完后,旧头向右走,新尾向左走,命中step1,新头和旧头都向左走,出现交叉情况,至此退出循环通过上面这个例子,我们把四种情况都命中了一下(一开始随便画的图没想到都命中了哈哈哈),也成功通过复用节点将真实结点变为预期结果,这里便是双端diff一个核心体现了但是如果四种情况都没有命中的呢(如图下)则会走向我们最后一个分支,也就是后面介绍的列表寻免费云主机域名找先来看懂里面涉及到的createKeyToOldIdx
函数源码地址: createKeyToOldIdx函数再来看一下里面涉及到的findIdxInOld
函数源码地址:findIdxInOld函数进入正文看完源码其实可以总结一下,就是前面四个都没有命中后,就会生成旧节点孩子的key
表新头节点的key
有效的话,就拿新头节点的key
去旧节点的key
表找,找不到就创建新的真实节点, 找得到的话就判断是否值得打补丁,值得的话就打补丁后复用节点,然后将该旧节点孩子值置空,不值得就创建新节点新头节点的key
无效的话,则去遍历旧节点数组挨个进行判断是否值得打补丁,后续跟上述一样新头指针向前一步走也使用一下上面的例子运用一下这个步骤,以下都为key有效的情况(重新放一下图,方便看)生成了一个旧节点的key表(key为键,值为下标), 然后newStartVnode
的key
值为B,找到旧节点孩子该节点下标为1,则去判断是否直接打补丁,值得的话将该旧节点孩子置空再在A前面插入B右图的表中B没有变为undefined是因为表示一开始就生成的,在下次进入循环的时候生成的表才会没有B然后将新头向右走一步,然后重开,发现前四步依旧没有命中,此时新头结点为B,但是生成的旧节点表没有B,故创建新的节点,然后插入新头继续向右走,重开,命中step1(如图左), 之后新头和旧头齐头并进向右走, 此时,旧头指向的undefined
(图右),直接向右走,重开发现此时又都没有命中, 此时也是生成一个key
表,发现找不到,于是创建新节点M插入然后新头继续向前走,依旧都没有命中,通过key
表去寻找,找到了D,于是移动插入,旧节点孩子的D置空,同时新头向前一步走走完这一步其实就出现交叉情况了,退出循环,此时如下图,你会发现,诶,前面确实得到预期了,可是后面还有一串呢别急,这就来处理对于上面这个例子,就是把后面那一段,通过遍历的方式,挨个删除Vue具体轻量级框架、简单易学、双向数据绑定、组件化、数据和结构的分离、虚拟DOM、运行速度快等优势,Vue中页面使用的是局部刷新,不用每次跳转页面都要请求所有数据和dom,可以大大提升访问速度和用户体验。到此,关于“vue2的diff算法怎么使用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!
这篇文章主要介绍“如何用c语言代码判断两个矩阵是否相等”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何用c语言代码判断两个矩阵是否相等”文章能帮助大家解决问题。代码如下:关于“如何用c语言代码判免费云主机域名断两个矩…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。