From 3a54222f55b207ebd409fe94e58d367c4f5a1495 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Thu, 23 Jan 2020 00:31:44 +0100 Subject: [PATCH] avoid removing existing dom nodes on subsequent replaceNode calls --- src/diff/index.js | 1 + test/browser/render.test.js | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/diff/index.js b/src/diff/index.js index b154e085b0d..2ea3f7315df 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -315,6 +315,7 @@ function diffElementNodes( } } else if (newVNode !== oldVNode) { if (excessDomChildren != null) { + excessDomChildren[excessDomChildren.indexOf(dom)] = null; excessDomChildren = EMPTY_ARR.slice.call(dom.childNodes); } diff --git a/test/browser/render.test.js b/test/browser/render.test.js index 7690d7ff56c..78b46c03082 100644 --- a/test/browser/render.test.js +++ b/test/browser/render.test.js @@ -1311,6 +1311,29 @@ describe('render()', () => { options._diff = prevDiff; }); + describe('subsequent replaces', () => { + it("shouldn't remove elements", () => { + const placeholder = document.createElement('div'); + scratch.appendChild(placeholder); + const App = () => ( +
+ New content + +
+ ); + + render(, scratch, placeholder); + expect(scratch.innerHTML).to.equal( + '
New content
' + ); + + render(, scratch, placeholder); + expect(scratch.innerHTML).to.equal( + '
New content
' + ); + }); + }); + describe('replaceNode parameter', () => { function appendChildToScratch(id) { const child = document.createElement('div');