From 94eaec6ec320bef2044426b1b17d527e5c2576d9 Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 20 Aug 2021 18:38:52 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/wrapper/layout.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/core/wrapper/layout.js b/src/core/wrapper/layout.js index b8a2615f1..6f1824b5d 100644 --- a/src/core/wrapper/layout.js +++ b/src/core/wrapper/layout.js @@ -440,19 +440,19 @@ BI.Layout = BI.inherit(BI.Widget, { newStartVnode = newCh[++newStartIdx]; } else { var sameOldVnode = findOldVnode(oldCh, newStartVnode, oldStartIdx, oldEndIdx); - if (BI.isNull(sameOldVnode)) { // 不存在就把新的放到左边 + if (BI.isNull(sameOldVnode[0])) { // 不存在就把新的放到左边 delete self._children[self._getChildName(newStartIdx)]; var node = addNode(newStartVnode, newStartIdx); insertBefore(node, oldStartVnode); } else { // 如果新节点在旧节点区间中存在就复用一下 - BI.each(oldCh, function (index, child) { - if (child && sameVnode(child, newStartVnode)) { - updated = self.patchItem(sameOldVnode, newStartVnode, index, index) || updated; - children[sameOldVnode.key == null ? index : sameOldVnode.key] = self._children[self._getChildName(index)]; - oldCh[index] = undefined; - insertBefore(sameOldVnode, oldStartVnode); - } - }); + var sameOldIndex = sameOldVnode[1]; + updated = self.patchItem(sameOldVnode[0], newStartVnode, sameOldIndex, newStartIdx) || updated; + children[sameOldVnode[0].key == null ? newStartIdx : sameOldVnode[0].key] = self._children[self._getChildName(newStartIdx)] = self._children[self._getChildName(sameOldIndex)]; + if (newStartIdx !== sameOldIndex) { + delete self._children[self._getChildName(sameOldIndex)]; + } + oldCh[sameOldIndex] = undefined; + insertBefore(sameOldVnode[0], oldStartVnode); } newStartVnode = newCh[++newStartIdx]; } @@ -531,13 +531,14 @@ BI.Layout = BI.inherit(BI.Widget, { } function findOldVnode (vnodes, vNode, beginIdx, endIdx) { - var i, found; + var i, found, findIndex; for (i = beginIdx; i <= endIdx; ++i) { if (vnodes[i] && sameVnode(vnodes[i], vNode)) { found = vnodes[i]; + findIndex = i; } } - return found; + return [found, findIndex]; } return updated;