From 3abc678f9caa339f3eb53736d507e097ca6995e7 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 5 Apr 2022 00:32:12 -0600 Subject: [PATCH 1/2] add test for clearing component after multiple rerenders --- src/__tests__/rerender.test.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/__tests__/rerender.test.js b/src/__tests__/rerender.test.js index 8dcc685..2e1b423 100644 --- a/src/__tests__/rerender.test.js +++ b/src/__tests__/rerender.test.js @@ -19,4 +19,13 @@ describe('rerender', () => { rerender({ props: { name: '' } }) expect(isDestroyed).toBeTruthy() }) + + test('destroys old components on multiple rerenders', () => { + const { rerender, queryByText } = render(Comp, { props: { name: 'Neil' } }) + + rerender({ props: { name: 'Alex' } }) + expect(queryByText('Hello Neil!')).not.toBeInTheDocument() + rerender({ props: { name: 'Geddy' } }) + expect(queryByText('Hello Alex!')).not.toBeInTheDocument() + }) }) From 8fe797d6c32046f1a941ce24888a71ced3251b93 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 5 Apr 2022 11:17:33 -0600 Subject: [PATCH 2/2] fix: always destroy most recent component on rerender --- .all-contributorsrc | 10 ++++++++++ README.md | 1 + src/pure.js | 10 +++++----- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 8eef4b6..ad657f1 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,16 @@ "contributions": [ "test" ] + }, + { + "login": "jgbowser", + "name": "John Bowser", + "avatar_url": "https://avatars.githubusercontent.com/u/66637570?v=4", + "profile": "https://johnbowser.dev/", + "contributions": [ + "code", + "test" + ] } ], "contributorsPerLine": 7, diff --git a/README.md b/README.md index 8927692..102430d 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ Thanks goes to these people ([emoji key][emojis]):
Bob

🐛 💻
Ron Merkin

💻
Ben McCann

⚠️ +
John Bowser

💻 ⚠️ diff --git a/src/pure.js b/src/pure.js index f6fef83..f2f6040 100644 --- a/src/pure.js +++ b/src/pure.js @@ -49,7 +49,7 @@ const render = ( return { props: options } } - const component = new ComponentConstructor({ + let component = new ComponentConstructor({ target, ...checkProps(options) }) @@ -67,15 +67,15 @@ const render = ( if (componentCache.has(component)) component.$destroy() // eslint-disable-next-line no-new - const newComponent = new ComponentConstructor({ + component = new ComponentConstructor({ target, ...checkProps(options) }) - containerCache.set(container, { target, newComponent }) - componentCache.add(newComponent) + containerCache.set(container, { target, component }) + componentCache.add(component) - newComponent.$$.on_destroy.push(() => { componentCache.delete(newComponent) }) + component.$$.on_destroy.push(() => { componentCache.delete(component) }) }, unmount: () => { if (componentCache.has(component)) component.$destroy()