From 8ffb4eb91ad039b0ea2731bda88a70c39aa638b8 Mon Sep 17 00:00:00 2001 From: zhulongzheng Date: Mon, 28 Nov 2016 22:17:20 -0800 Subject: [PATCH] Fix bug of updating one child with same key but different sel --- src/snabbdom.ts | 17 +++++++---------- test/core.js | 10 ++++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/snabbdom.ts b/src/snabbdom.ts index 2b48f9f..7460c1b 100644 --- a/src/snabbdom.ts +++ b/src/snabbdom.ts @@ -188,9 +188,13 @@ export function init(modules: Array, domApi?: DOMAPI) { newStartVnode = newCh[++newStartIdx]; } else { elmToMove = oldCh[idxInOld]; - patchVnode(elmToMove, newStartVnode, insertedVnodeQueue); - oldCh[idxInOld] = undefined as any; - api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm as Element); + if (elmToMove.sel !== newStartVnode.sel) { + api.insertBefore(parentElm, createElm(newStartVnode, insertedVnodeQueue), oldStartVnode.elm as Element); + } else { + patchVnode(elmToMove, newStartVnode, insertedVnodeQueue); + oldCh[idxInOld] = undefined as any; + api.insertBefore(parentElm, elmToMove.elm, oldStartVnode.elm as Element); + } newStartVnode = newCh[++newStartIdx]; } } @@ -210,13 +214,6 @@ export function init(modules: Array, domApi?: DOMAPI) { } let elm = vnode.elm = oldVnode.elm, oldCh = oldVnode.children, ch = vnode.children; if (oldVnode === vnode) return; - if (!sameVnode(oldVnode, vnode)) { - const parentElm = api.parentNode(oldVnode.elm as Element); - elm = createElm(vnode, insertedVnodeQueue); - api.insertBefore(parentElm, elm, oldVnode.elm as Element); - removeVnodes(parentElm, [oldVnode], 0, 0); - return; - } if (isDef(vnode.data)) { for (i = 0; i < cbs.update.length; ++i) cbs.update[i](oldVnode, vnode); i = (vnode.data as VNodeData).hook; diff --git a/test/core.js b/test/core.js index 6a410d0..5066179 100644 --- a/test/core.js +++ b/test/core.js @@ -250,6 +250,16 @@ describe('snabbdom', function() { elm = patch(vnode1, vnode2).elm; assert.equal(elm.children.length, 0); }); + it('update one child with same key but different sel', function() { + var vnode1 = h('span', {key: 'span'}, [1, 2, 3].map(spanNum)); + var vnode2 = h('span', {key: 'span'}, [spanNum(1), h('i', {key: 2}, '2'), spanNum(3)]); + elm = patch(vnode0, vnode1).elm; + assert.deepEqual(map(inner, elm.children), ['1', '2', '3']); + elm = patch(vnode1, vnode2).elm; + assert.deepEqual(map(inner, elm.children), ['1', '2', '3']); + assert.equal(elm.children.length, 3); + assert.equal(elm.children[1].tagName, 'I'); + }); }); describe('removal of elements', function() { it('removes elements from the beginning', function() {