From 737f83f070b846d66f5f1e62a00ae685a01dd483 Mon Sep 17 00:00:00 2001 From: dailer Date: Tue, 7 May 2019 14:44:26 +0800 Subject: [PATCH] =?UTF-8?q?=E6=97=A0JIRA=E4=BB=BB=E5=8A=A1=20fix:=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E4=B8=80=E4=B8=8Blayout=E7=9A=84updateChildren?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/wrapper/layout.js | 39 ++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/src/core/wrapper/layout.js b/src/core/wrapper/layout.js index cd90f24de..568bd4299 100644 --- a/src/core/wrapper/layout.js +++ b/src/core/wrapper/layout.js @@ -421,9 +421,22 @@ BI.Layout = BI.inherit(BI.Widget, { oldEndVnode = oldCh[--oldEndIdx]; newStartVnode = newCh[++newStartIdx]; } else { - var node = addNode(newStartVnode); - insertBefore(node, oldStartVnode); - newStartVnode = newCh[++newStartIdx]; + var sameOldVnode = findOldVnode(oldCh, newStartVnode, oldStartIdx, oldEndIdx); + if (BI.isNull(sameOldVnode)) { // 不存在就把新的放到左边 + var node = addNode(newStartVnode); + insertBefore(node, oldStartVnode); + newStartVnode = newCh[++newStartIdx]; + } else { // 如果新节点在就旧节点区间中存在就复用一下 + BI.each(oldCh, function (index, child) { + if (child && sameVnode(child, newStartVnode)) { + updated = self.patchItem(sameOldVnode, newStartVnode, index) || updated; + children[sameOldVnode.key == null ? self._getChildName(index) : sameOldVnode.key] = self._children[self._getChildName(index)]; + oldCh[index] = undefined; + insertBefore(sameOldVnode, oldStartVnode); + } + }); + newStartVnode = newCh[++newStartIdx]; + } } } if (oldStartIdx > oldEndIdx) { @@ -467,9 +480,13 @@ BI.Layout = BI.inherit(BI.Widget, { function removeVnodes (vnodes, startIdx, endIdx) { for (; startIdx <= endIdx; ++startIdx) { - var node = self._getOptions(vnodes[startIdx]); - var key = node.key == null ? self._getChildName(startIdx) : node.key; - children[key]._destroy(); + var ch = vnodes[startIdx]; + if (BI.isNotNull(ch)) { + var node = self._getOptions(ch); + var key = node.key == null ? self._getChildName(startIdx) : node.key; + delete self._children[self._getChildName(key)]; + children[key]._destroy(); + } } } @@ -495,6 +512,16 @@ BI.Layout = BI.inherit(BI.Widget, { } } + function findOldVnode (vnodes, vNode, beginIdx, endIdx) { + var i, found; + for (i = beginIdx; i <= endIdx; ++i) { + if (vnodes[i] && sameVnode(vnodes[i], vNode)) { + found = vnodes[i]; + } + } + return found; + } + return updated; },