diff --git a/src/diff/children.js b/src/diff/children.js index 22b7a61c9c..b44d5168e8 100644 --- a/src/diff/children.js +++ b/src/diff/children.js @@ -303,14 +303,11 @@ function constructNewChildrenArray(newParentVNode, renderResult, oldChildren) { if (remainingOldChildren > newChildrenLength - skewedIndex) { skew += matchingIndex - skewedIndex; } else { - // ### Change from keyed: I think this was missing from the algo... skew--; } } else if (matchingIndex < skewedIndex) { if (matchingIndex == skewedIndex - 1) { skew = matchingIndex - skewedIndex; - } else { - skew = 0; } } else { skew = 0; @@ -429,7 +426,10 @@ function findMatchingIndex( if ( oldVNode === null || - (oldVNode && key == oldVNode.key && type === oldVNode.type) + (oldVNode && + key == oldVNode.key && + type === oldVNode.type && + (oldVNode._flags & MATCHED) === 0) ) { return skewedIndex; } else if (shouldSearch) { diff --git a/test/browser/render.test.js b/test/browser/render.test.js index 075b6ad39f..ae42ce2720 100644 --- a/test/browser/render.test.js +++ b/test/browser/render.test.js @@ -1357,6 +1357,133 @@ describe('render()', () => { expect(scratch.innerHTML).to.equal('
_A1
+_A2
+_A4
+_A6
+_A8
+_B1
+_B2
+_B3
+_B5
+_B6
+_B8
+_B1
_B2
_B3
_B5
_B6
_B8
_A1
+_A2
+_A5
+_A8
+_A11
+_B1
+_B2
+_B3
+_B5
+_B6
+_B7
+_B9
+_B10
+_B11
+_B12
+_B1
_B2
_B3
_B5
_B6
_B7
_B9
_B10
_B11
_B12