当前位置: 首页 > news >正文

颖灵信息科技网站建设东莞网站建设销售前景怎么样

颖灵信息科技网站建设,东莞网站建设销售前景怎么样,个人做网络推广哪个网站好,wordpress 随机图片插件1. 前言 在上一篇文章中#xff0c;我们了解了Vue中的patch过程#xff0c;即DOM-Diff算法。并且知道了在patch过程中基本会干三件事#xff0c;分别是#xff1a;创建节点#xff0c;删除节点和更新节点。创建节点和删除节点都比较简单#xff0c;而更新节点因为要处理…1. 前言 在上一篇文章中我们了解了Vue中的patch过程即DOM-Diff算法。并且知道了在patch过程中基本会干三件事分别是创建节点删除节点和更新节点。创建节点和删除节点都比较简单而更新节点因为要处理各种可能出现的情况所以逻辑略微复杂一些但是没关系我们通过分析过程对照源码画逻辑流程图来帮助我们理解了其中的过程。最后我们还遗留了一个问题那就是在更新节点过程中新旧VNode可能都包含有子节点对于子节点的对比更新会有额外的一些逻辑那么在本篇文章中我们就来学习在Vue中是怎么对比更新子节点的。 2. 更新子节点 当新的VNode与旧的oldVNode都是元素节点并且都包含子节点时那么这两个节点的VNode实例上的children属性就是所包含的子节点数组。我们把新的VNode上的子节点数组记为newChildren把旧的oldVNode上的子节点数组记为oldChildren我们把newChildren里面的元素与oldChildren里的元素一一进行对比对比两个子节点数组肯定是要通过循环外层循环newChildren数组内层循环oldChildren数组每循环外层newChildren数组里的一个子节点就去内层oldChildren数组里找看有没有与之相同的子节点伪代码如下 for (let i 0; i newChildren.length; i) {const newChild newChildren[i];for (let j 0; j oldChildren.length; j) {const oldChild oldChildren[j];if (newChild oldChild) {// ...}} }那么以上这个过程将会存在以下四种情况 创建子节点 如果newChildren里面的某个子节点在oldChildren里找不到与之相同的子节点那么说明newChildren里面的这个子节点是之前没有的是需要此次新增的节点那么就创建子节点。 删除子节点 如果把newChildren里面的每一个子节点都循环完毕后发现在oldChildren还有未处理的子节点那就说明这些未处理的子节点是需要被废弃的那么就将这些节点删除。 移动子节点 如果newChildren里面的某个子节点在oldChildren里找到了与之相同的子节点但是所处的位置不同这说明此次变化需要调整该子节点的位置那就以newChildren里子节点的位置为基准调整oldChildren里该节点的位置使之与在newChildren里的位置相同。 更新节点 如果newChildren里面的某个子节点在oldChildren里找到了与之相同的子节点并且所处的位置也相同那么就更新oldChildren里该节点使之与newChildren里的该节点相同。 OK到这里逻辑就相对清晰了接下来我们只需分门别类的处理这四种情况就好了。 3. 创建子节点 如果newChildren里面的某个子节点在oldChildren里找不到与之相同的子节点那么说明newChildren里面的这个子节点是之前没有的是需要此次新增的节点那么我们就创建这个节点创建好之后再把它插入到DOM中合适的位置。 创建节点这个很容易我们在上一篇文章的第三章已经介绍过了这里就不再赘述了。 那么创建好之后如何插入到DOM中的合适的位置呢显然把节点插入到DOM中是很容易的找到合适的位置是关键。接下来我们分析一下如何找这个合适的位置。我们看下面这个图  上图中左边是新的VNode右边是旧的oldVNode同时也是真实的DOM。这个图意思是当我们循环newChildren数组里面的子节点前两个子节点都在oldChildren里找到了与之对应的子节点那么我们将其处理处理过后把它们标志为已处理当循环到newChildren数组里第三个子节点时发现在oldChildren里找不到与之对应的子节点那么我们就需要创建这个节点创建好之后我们发现这个节点本是newChildren数组里左起第三个子节点那么我们就把创建好的节点插入到真实DOM里的第三个节点位置也就是所有已处理节点之后OK此时我们拍手称快所有已处理节点之后就是我们要找的合适的位置但是真的是这样吗我们再来看下面这个图  假如我们按照上面的方法把第三个节点插入到所有已处理节点之后此时如果第四个节点也在oldChildren里找不到与之对应的节点也是需要创建的节点那么当我们把第四个节点也按照上面的说的插入到已处理节点之后发现怎么插入到第三个位置了可明明这个节点在newChildren数组里是第四个啊 这就是问题所在其实我们应该把新创建的节点插入到所有未处理节点之前这样以来逻辑才正确。后面不管有多少个新增的节点每一个都插入到所有未处理节点之前位置才不会错。 所以合适的位置是所有未处理节点之前而并非所有已处理节点之后。 4. 删除子节点 如果把newChildren里面的每一个子节点都循环一遍能在oldChildren数组里找到的就处理它找不到的就新增直到把newChildren里面所有子节点都过一遍后发现在oldChildren还存在未处理的子节点那就说明这些未处理的子节点是需要被废弃的那么就将这些节点删除。 删除节点这个也很容易我们在上一篇文章的第四章已经介绍过了这里就不再赘述了。 5. 更新子节点 如果newChildren里面的某个子节点在oldChildren里找到了与之相同的子节点并且所处的位置也相同那么就更新oldChildren里该节点使之与newChildren里的该节点相同。 关于更新节点我们在上一篇文章的第五章已经介绍过了这里就不再赘述了。 6. 移动子节点 如果newChildren里面的某个子节点在oldChildren里找到了与之相同的子节点但是所处的位置不同这说明此次变化需要调整该子节点的位置那就以newChildren里子节点的位置为基准调整oldChildren里该节点的位置使之与在newChildren里的位置相同。 同样移动一个节点不难关键在于该移动到哪或者说关键在于移动到哪个位置这个位置才是关键。我们看下图  在上图中绿色的两个节点是相同节点但是所处位置不同即newChildren里面的第三个子节点与真实DOM即oldChildren里面的第四个子节点相同但是所处位置不同按照上面所说的我们应该以newChildren里子节点的位置为基准调整oldChildren里该节点的位置所以我们应该把真实DOM即oldChildren里面的第四个节点移动到第三个节点的位置通过上图中的标注我们不难发现所有未处理节点之前就是我们要移动的目的位置。如果此时你说那可不可以移动到所有已处理节点之后呢那就又回到了更新节点时所遇到的那个问题了如果前面有新增的节点呢 7. 回到源码 OK以上就是更新子节点时所要考虑的所有情况了分析完以后我们回到源码里看看实际情况是不是我们分析的这样子的源码如下 // 源码位置 /src/core/vdom/patch.jsif (isUndef(idxInOld)) { // 如果在oldChildren里找不到当前循环的newChildren里的子节点// 新增节点并插入到合适位置createElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx) } else {// 如果在oldChildren里找到了当前循环的newChildren里的子节点vnodeToMove oldCh[idxInOld]// 如果两个节点相同if (sameVnode(vnodeToMove, newStartVnode)) {// 调用patchVnode更新节点patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue)oldCh[idxInOld] undefined// canmove表示是否需要移动节点如果为true表示需要移动则移动节点如果为false则不用移动canMove nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm)} }以上代码中首先判断在oldChildren里能否找到当前循环的newChildren里的子节点如果找不到那就是新增节点并插入到合适位置如果找到了先对比两个节点是否相同若相同则先调用patchVnode更新节点更新完之后再看是否需要移动节点注意源码里在判断是否需要移动子节点时用了简写的方式下面这两种写法是等价的 canMove nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm) // 等同于 if(canMove){nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm) }我们看到源码里的实现跟我们分析的是一样一样的。 8. 总结 本篇文章我们分析了Vue在更新子节点时是外层循环newChildren数组内层循环oldChildren数组把newChildren数组里的每一个元素分别与oldChildren数组里的每一个元素匹配根据不同情况作出创建子节点、删除子节点、更新子节点以及移动子节点的操作。并且我们对不同情况的不同操作都进行了深入分析分析之后我们回到源码验证我们分析的正确性发现我们的分析跟源码的实现是一致的。 最后我们再思考一个问题这样双层循环虽然能解决问题但是如果节点数量很多这样循环算法的时间复杂度会不会很高有没有什么可以优化的办法答案当然是有的并且Vue也意识到了这点也进行了优化那么下篇文章我们就来分析当节点数量很多时Vue是怎么优化算法的。
文章转载自:
http://www.morning.fqqcd.cn.gov.cn.fqqcd.cn
http://www.morning.kphyl.cn.gov.cn.kphyl.cn
http://www.morning.bwjws.cn.gov.cn.bwjws.cn
http://www.morning.fktlr.cn.gov.cn.fktlr.cn
http://www.morning.swkpq.cn.gov.cn.swkpq.cn
http://www.morning.tkzqw.cn.gov.cn.tkzqw.cn
http://www.morning.hknk.cn.gov.cn.hknk.cn
http://www.morning.qsdnt.cn.gov.cn.qsdnt.cn
http://www.morning.kyjyt.cn.gov.cn.kyjyt.cn
http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn
http://www.morning.hytfz.cn.gov.cn.hytfz.cn
http://www.morning.nldsd.cn.gov.cn.nldsd.cn
http://www.morning.fjfjm.cn.gov.cn.fjfjm.cn
http://www.morning.rhqr.cn.gov.cn.rhqr.cn
http://www.morning.okiner.com.gov.cn.okiner.com
http://www.morning.mjjty.cn.gov.cn.mjjty.cn
http://www.morning.qlck.cn.gov.cn.qlck.cn
http://www.morning.bzkgn.cn.gov.cn.bzkgn.cn
http://www.morning.bpmfn.cn.gov.cn.bpmfn.cn
http://www.morning.zzaxr.cn.gov.cn.zzaxr.cn
http://www.morning.rfwgg.cn.gov.cn.rfwgg.cn
http://www.morning.dhqg.cn.gov.cn.dhqg.cn
http://www.morning.tnqk.cn.gov.cn.tnqk.cn
http://www.morning.dglszn.com.gov.cn.dglszn.com
http://www.morning.hxftm.cn.gov.cn.hxftm.cn
http://www.morning.hgsylxs.com.gov.cn.hgsylxs.com
http://www.morning.mxlmn.cn.gov.cn.mxlmn.cn
http://www.morning.qfmcm.cn.gov.cn.qfmcm.cn
http://www.morning.qhln.cn.gov.cn.qhln.cn
http://www.morning.qsyyp.cn.gov.cn.qsyyp.cn
http://www.morning.ssjry.cn.gov.cn.ssjry.cn
http://www.morning.wglhz.cn.gov.cn.wglhz.cn
http://www.morning.bmfqg.cn.gov.cn.bmfqg.cn
http://www.morning.rfxw.cn.gov.cn.rfxw.cn
http://www.morning.datadragon-auh.cn.gov.cn.datadragon-auh.cn
http://www.morning.mwpcp.cn.gov.cn.mwpcp.cn
http://www.morning.jxjrm.cn.gov.cn.jxjrm.cn
http://www.morning.rkkh.cn.gov.cn.rkkh.cn
http://www.morning.tfkqc.cn.gov.cn.tfkqc.cn
http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn
http://www.morning.qddtd.cn.gov.cn.qddtd.cn
http://www.morning.hphqy.cn.gov.cn.hphqy.cn
http://www.morning.geledi.com.gov.cn.geledi.com
http://www.morning.hmsong.com.gov.cn.hmsong.com
http://www.morning.stpkz.cn.gov.cn.stpkz.cn
http://www.morning.flchj.cn.gov.cn.flchj.cn
http://www.morning.sjjtz.cn.gov.cn.sjjtz.cn
http://www.morning.kksjr.cn.gov.cn.kksjr.cn
http://www.morning.fktlg.cn.gov.cn.fktlg.cn
http://www.morning.pyncx.cn.gov.cn.pyncx.cn
http://www.morning.pzqnj.cn.gov.cn.pzqnj.cn
http://www.morning.mbaiwan.com.gov.cn.mbaiwan.com
http://www.morning.kzslk.cn.gov.cn.kzslk.cn
http://www.morning.lgkbn.cn.gov.cn.lgkbn.cn
http://www.morning.ywrt.cn.gov.cn.ywrt.cn
http://www.morning.khntd.cn.gov.cn.khntd.cn
http://www.morning.ftntr.cn.gov.cn.ftntr.cn
http://www.morning.rzcmn.cn.gov.cn.rzcmn.cn
http://www.morning.shxmr.cn.gov.cn.shxmr.cn
http://www.morning.cbtn.cn.gov.cn.cbtn.cn
http://www.morning.rzysq.cn.gov.cn.rzysq.cn
http://www.morning.wxlzr.cn.gov.cn.wxlzr.cn
http://www.morning.jkzq.cn.gov.cn.jkzq.cn
http://www.morning.lfjmp.cn.gov.cn.lfjmp.cn
http://www.morning.bsqkt.cn.gov.cn.bsqkt.cn
http://www.morning.bwnd.cn.gov.cn.bwnd.cn
http://www.morning.rnmc.cn.gov.cn.rnmc.cn
http://www.morning.qpfmh.cn.gov.cn.qpfmh.cn
http://www.morning.mdtfh.cn.gov.cn.mdtfh.cn
http://www.morning.hpkr.cn.gov.cn.hpkr.cn
http://www.morning.mgwpy.cn.gov.cn.mgwpy.cn
http://www.morning.mszls.cn.gov.cn.mszls.cn
http://www.morning.mgwdp.cn.gov.cn.mgwdp.cn
http://www.morning.lwcgh.cn.gov.cn.lwcgh.cn
http://www.morning.grlth.cn.gov.cn.grlth.cn
http://www.morning.zlhbg.cn.gov.cn.zlhbg.cn
http://www.morning.nrwr.cn.gov.cn.nrwr.cn
http://www.morning.lmhh.cn.gov.cn.lmhh.cn
http://www.morning.hwlmy.cn.gov.cn.hwlmy.cn
http://www.morning.qsmdd.cn.gov.cn.qsmdd.cn
http://www.tj-hxxt.cn/news/262650.html

相关文章:

  • 江阴 网站开发网站建设试题及答案
  • 最好网站开发公司做ppt的素材免费网站
  • 企业网站托管方案内容具体有哪些网站构思
  • wordpress开启子域名多站点模式网站开发文档包括
  • 成都网站建设金网科技个人建什么网站最赚钱
  • 网站后台是做什么的网站设置反爬虫的常用方法有哪些
  • 网站问题解决找大连做企业网站的公司
  • 关于推动门户网站建设d厦门网站外包
  • 泰安网站建设怎么样前端开发岗位
  • 犍为移动网站建设惠安 网站建设公司
  • 做外贸网站如果是东西杂会不会不好推广网站空间就是服务器吗
  • 做模拟人生比较有名的网站中国各大网站开发语言
  • 芸志建站怎么建立网站网站分析报告怎么做
  • 建设网站需要专业建设网站需要什么设备
  • 网页游戏网站大全突袭怎么做网站主
  • ui网站模板网站建设公司推广方案
  • 网站给挂黑链最佳的资源搜索引擎
  • 西安那些做网站的公司个人主页网页设计源代码
  • 学校网站建设评估企业网站模板包含什么
  • 做网站加推广不用付费就可以看亏亏的app
  • 网站优化含义做机械有什么兼职网站
  • 电子商务网站建设复习题简单商业网站模板
  • 网站域名备案密码上海营销型网站建站
  • vs2015 建设微网站桂城网站制作专业公司
  • 巩义网站优化技巧手机怎么做网站添加背景音乐
  • 用户体验网站营销培训去哪个学校好
  • wordpress视频站代码印度电商平台网站建设策划
  • 郑州市做网站公司百度推广一个关键词多少钱
  • 网站seo关键词优化技巧哪个平台买东西最便宜
  • 网站开发技术难度海南省建设网站首页