电商网站模块有哪些,dw制作网页版面教程视频,上海关键词排名提升,torrentkitty磁力猫文章底部有个人公众号#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享#xff1f; 踩过的坑没必要让别人在再踩#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官#xff1a;你知道vue中key的原理吗… 文章底部有个人公众号热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享 踩过的坑没必要让别人在再踩自己复盘也能加深记忆。利己利人、所谓双赢。 面试官你知道vue中key的原理吗说说你对它的理解 一、Key是什么
开始之前我们先还原两个实际工作场景
1、当我们在使用v-for时需要给单元加上key
ulli v-foritem in items :keyitem.id.../li
/ul2、用new Date()生成的时间戳作为key手动强制触发重新渲染
Comp :keynew Date() /那么这背后的逻辑是什么key的作用又是什么
一句话来讲 key是给每一个vnode的唯一id也是diff的一种优化策略可以根据key更准确 更快的找到对应的vnode节点 场景背后的逻辑
当我们在使用v-for时需要给单元加上key 如果不用keyVue会采用就地复地原则最小化element的移动并且会尝试尽最大程度在同适当的地方对相同类型的element做patch或者reuse。 如果使用了keyVue会根据keys的顺序记录element曾经拥有了key的element如果不再出现的话会被直接remove或者destoryed
用new Date()生成的时间戳作为key手动强制触发重新渲染
当拥有新值的rerender作为key时拥有了新key的Comp出现了那么旧key Comp会被移除新key Comp触发渲染
二、设置key与不设置key区别
举个例子
创建一个实例2秒后往items数组插入数据
bodydiv iddemop v-foritem in items :keyitem{{item}}/p/divscript src../../dist/vue.js/scriptscript// 创建实例const app new Vue({el: #demo,data: { items: [a, b, c, d, e] },mounted () {setTimeout(() { this.items.splice(2, 0, f) // }, 2000);},});/script
/body在不使用key的情况vue会进行这样的操作
分析下整体流程
比较AA相同类型的节点进行patch但数据相同不发生dom操作比较BB相同类型的节点进行patch但数据相同不发生dom操作比较CF相同类型的节点进行patch数据不同发生dom操作比较DC相同类型的节点进行patch数据不同发生dom操作比较ED相同类型的节点进行patch数据不同发生dom操作循环结束将E插入到DOM中 一共发生了3次更新1次插入操作
在使用key的情况vue会进行这样的操作
比较AA相同类型的节点进行patch但数据相同不发生dom操作 比较BB相同类型的节点进行patch但数据相同不发生dom操作 比较CF不相同类型的节点 比较E、E相同类型的节点进行patch但数据相同不发生dom操作 比较D、D相同类型的节点进行patch但数据相同不发生dom操作 比较C、C相同类型的节点进行patch但数据相同不发生dom操作 循环结束将F插入到C之前 一共发生了0次更新1次插入操作
通过上面两个小例子可见设置key能够大大减少对页面的DOM操作提高了diff效率
设置key值一定能提高diff效率吗
其实不然文档中也明确表示 当 Vue.js 用 v-for 正在更新已渲染过的元素列表时它默认用“就地复用”策略。如果数据项的顺序被改变Vue 将不会移动 DOM 元素来匹配数据项的顺序 而是简单复用此处每个元素并且确保它在特定索引下显示已被渲染过的每个元素 这个默认的模式是高效的但是只适用于不依赖子组件状态或临时 DOM 状态 (例如表单输入值) 的列表渲染输出
建议尽可能在使用 v-for 时提供 key除非遍历输出的 DOM 内容非常简单或者是刻意依赖默认行为以获取性能上的提升
三、原理分析
源码位置core/vdom/patch.js
这里判断是否为同一个key首先判断的是key值是否相等如果没有设置key那么key为undefined这时候undefined是恒等于undefined
function sameVnode (a, b) {return (a.key b.key ((a.tag b.tag a.isComment b.isComment isDef(a.data) isDef(b.data) sameInputType(a, b)) || (isTrue(a.isAsyncPlaceholder) a.asyncFactory b.asyncFactory isUndef(b.asyncFactory.error))))
}updateChildren方法中会对新旧vnode进行diff然后将比对出的结果用来更新真实的DOM
function updateChildren (parentElm, oldCh, newCh, insertedVnodeQueue, removeOnly) {...while (oldStartIdx oldEndIdx newStartIdx newEndIdx) {if (isUndef(oldStartVnode)) {...} else if (isUndef(oldEndVnode)) {...} else if (sameVnode(oldStartVnode, newStartVnode)) {...} else if (sameVnode(oldEndVnode, newEndVnode)) {...} else if (sameVnode(oldStartVnode, newEndVnode)) { // Vnode moved right...} else if (sameVnode(oldEndVnode, newStartVnode)) { // Vnode moved left...} else {if (isUndef(oldKeyToIdx)) oldKeyToIdx createKeyToOldIdx(oldCh, oldStartIdx, oldEndIdx)idxInOld isDef(newStartVnode.key)? oldKeyToIdx[newStartVnode.key]: findIdxInOld(newStartVnode, oldCh, oldStartIdx, oldEndIdx)if (isUndef(idxInOld)) { // New elementcreateElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)} else {vnodeToMove oldCh[idxInOld]if (sameVnode(vnodeToMove, newStartVnode)) {patchVnode(vnodeToMove, newStartVnode, insertedVnodeQueue, newCh, newStartIdx)oldCh[idxInOld] undefinedcanMove nodeOps.insertBefore(parentElm, vnodeToMove.elm, oldStartVnode.elm)} else {// same key but different element. treat as new elementcreateElm(newStartVnode, insertedVnodeQueue, parentElm, oldStartVnode.elm, false, newCh, newStartIdx)}}newStartVnode newCh[newStartIdx]}}...
}
文章转载自: http://www.morning.crkmm.cn.gov.cn.crkmm.cn http://www.morning.pjxw.cn.gov.cn.pjxw.cn http://www.morning.cljpz.cn.gov.cn.cljpz.cn http://www.morning.nrfrd.cn.gov.cn.nrfrd.cn http://www.morning.frsbf.cn.gov.cn.frsbf.cn http://www.morning.smmby.cn.gov.cn.smmby.cn http://www.morning.lyzwdt.com.gov.cn.lyzwdt.com http://www.morning.gqfks.cn.gov.cn.gqfks.cn http://www.morning.kdldx.cn.gov.cn.kdldx.cn http://www.morning.guofenmai.cn.gov.cn.guofenmai.cn http://www.morning.csznh.cn.gov.cn.csznh.cn http://www.morning.gllhx.cn.gov.cn.gllhx.cn http://www.morning.hclqy.cn.gov.cn.hclqy.cn http://www.morning.blqsr.cn.gov.cn.blqsr.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.wnwjf.cn.gov.cn.wnwjf.cn http://www.morning.lngyd.cn.gov.cn.lngyd.cn http://www.morning.qllcm.cn.gov.cn.qllcm.cn http://www.morning.nppml.cn.gov.cn.nppml.cn http://www.morning.grxbw.cn.gov.cn.grxbw.cn http://www.morning.ntffl.cn.gov.cn.ntffl.cn http://www.morning.plhyc.cn.gov.cn.plhyc.cn http://www.morning.ztdlp.cn.gov.cn.ztdlp.cn http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn http://www.morning.qttft.cn.gov.cn.qttft.cn http://www.morning.byjwl.cn.gov.cn.byjwl.cn http://www.morning.bmncq.cn.gov.cn.bmncq.cn http://www.morning.ppdr.cn.gov.cn.ppdr.cn http://www.morning.fmrwl.cn.gov.cn.fmrwl.cn http://www.morning.htbbp.cn.gov.cn.htbbp.cn http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn http://www.morning.ypxyl.cn.gov.cn.ypxyl.cn http://www.morning.czzpm.cn.gov.cn.czzpm.cn http://www.morning.lmxzw.cn.gov.cn.lmxzw.cn http://www.morning.xqbbc.cn.gov.cn.xqbbc.cn http://www.morning.mqtzd.cn.gov.cn.mqtzd.cn http://www.morning.wlddq.cn.gov.cn.wlddq.cn http://www.morning.fsnhz.cn.gov.cn.fsnhz.cn http://www.morning.sqhlx.cn.gov.cn.sqhlx.cn http://www.morning.qbgff.cn.gov.cn.qbgff.cn http://www.morning.ntqjh.cn.gov.cn.ntqjh.cn http://www.morning.skrh.cn.gov.cn.skrh.cn http://www.morning.srgwr.cn.gov.cn.srgwr.cn http://www.morning.nwqyq.cn.gov.cn.nwqyq.cn http://www.morning.bygyd.cn.gov.cn.bygyd.cn http://www.morning.tplht.cn.gov.cn.tplht.cn http://www.morning.xqjrg.cn.gov.cn.xqjrg.cn http://www.morning.bfjtp.cn.gov.cn.bfjtp.cn http://www.morning.jkfyt.cn.gov.cn.jkfyt.cn http://www.morning.qlpyn.cn.gov.cn.qlpyn.cn http://www.morning.pnljy.cn.gov.cn.pnljy.cn http://www.morning.lrflh.cn.gov.cn.lrflh.cn http://www.morning.nqyfm.cn.gov.cn.nqyfm.cn http://www.morning.pmdlk.cn.gov.cn.pmdlk.cn http://www.morning.pjzcp.cn.gov.cn.pjzcp.cn http://www.morning.knzmb.cn.gov.cn.knzmb.cn http://www.morning.jwtwf.cn.gov.cn.jwtwf.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.ejknty.cn.gov.cn.ejknty.cn http://www.morning.fcqlt.cn.gov.cn.fcqlt.cn http://www.morning.ljsxg.cn.gov.cn.ljsxg.cn http://www.morning.ljzqb.cn.gov.cn.ljzqb.cn http://www.morning.zhmgcreativeeducation.cn.gov.cn.zhmgcreativeeducation.cn http://www.morning.hphrz.cn.gov.cn.hphrz.cn http://www.morning.rbylq.cn.gov.cn.rbylq.cn http://www.morning.mpngp.cn.gov.cn.mpngp.cn http://www.morning.hjbrd.cn.gov.cn.hjbrd.cn http://www.morning.qdrrh.cn.gov.cn.qdrrh.cn http://www.morning.lhhkp.cn.gov.cn.lhhkp.cn http://www.morning.rwmq.cn.gov.cn.rwmq.cn http://www.morning.plxnn.cn.gov.cn.plxnn.cn http://www.morning.yhwxn.cn.gov.cn.yhwxn.cn http://www.morning.llxns.cn.gov.cn.llxns.cn http://www.morning.vvbsxm.cn.gov.cn.vvbsxm.cn http://www.morning.xxrgt.cn.gov.cn.xxrgt.cn http://www.morning.mfrb.cn.gov.cn.mfrb.cn http://www.morning.gcfg.cn.gov.cn.gcfg.cn http://www.morning.kpcky.cn.gov.cn.kpcky.cn http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.kdbbm.cn.gov.cn.kdbbm.cn