From 71362b776a5ef4d83965499c1f572717f13572ec Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 2 Sep 2022 21:01:42 +0200 Subject: [PATCH 1/8] cleanup _parent, __hooks and _dom when unmounting --- hooks/src/index.js | 1 + src/diff/index.js | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hooks/src/index.js b/hooks/src/index.js index ffb7899822..3804789f43 100644 --- a/hooks/src/index.js +++ b/hooks/src/index.js @@ -110,6 +110,7 @@ options.unmount = vnode => { hasErrored = e; } }); + c.__hooks = undefined; if (hasErrored) options._catchError(hasErrored, c._vnode); } }; diff --git a/src/diff/index.js b/src/diff/index.js index 616bd93ae9..ee7c96eb01 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -522,11 +522,14 @@ export function unmount(vnode, parentVNode, skipRemove) { } } - if (!skipRemove && vnode._dom != null) removeNode(vnode._dom); + if (!skipRemove && vnode._dom != null) { + removeNode(vnode._dom); + vnode._dom = undefined; + } // Must be set to `undefined` to properly clean up `_nextDom` // for which `null` is a valid value. See comment in `create-element.js` - vnode._dom = vnode._nextDom = undefined; + vnode._parent = vnode._dom = vnode._nextDom = undefined; } /** The `.render()` method for a PFC backing instance. */ From 78866ff4b22d23e302c348bc4a0079ffa4495666 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 2 Sep 2022 21:14:21 +0200 Subject: [PATCH 2/8] set listeners --- mangle.json | 1 + src/diff/index.js | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mangle.json b/mangle.json index 3f0bcc8dcf..26be490c61 100644 --- a/mangle.json +++ b/mangle.json @@ -25,6 +25,7 @@ "props": { "cname": 6, "props": { + "$_listeners": "l", "$_cleanup": "__c", "$__hooks": "__H", "$_list": "__", diff --git a/src/diff/index.js b/src/diff/index.js index ee7c96eb01..dc27dba8ca 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -524,12 +524,11 @@ export function unmount(vnode, parentVNode, skipRemove) { if (!skipRemove && vnode._dom != null) { removeNode(vnode._dom); - vnode._dom = undefined; } // Must be set to `undefined` to properly clean up `_nextDom` // for which `null` is a valid value. See comment in `create-element.js` - vnode._parent = vnode._dom = vnode._nextDom = undefined; + vnode._dom = vnode._parent = vnode._dom = vnode._nextDom = undefined; } /** The `.render()` method for a PFC backing instance. */ From 5d8b33c62c34de074099680b893b9dffd002b88b Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sat, 3 Sep 2022 10:39:07 +0200 Subject: [PATCH 3/8] try out perf impact --- src/diff/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/diff/index.js b/src/diff/index.js index dc27dba8ca..ab7b93b7c5 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -528,7 +528,8 @@ export function unmount(vnode, parentVNode, skipRemove) { // Must be set to `undefined` to properly clean up `_nextDom` // for which `null` is a valid value. See comment in `create-element.js` - vnode._dom = vnode._parent = vnode._dom = vnode._nextDom = undefined; + if (vnode._dom) vnode._dom._listeners = undefined + vnode._children = vnode._dom = vnode._parent = vnode._dom = vnode._nextDom = undefined; } /** The `.render()` method for a PFC backing instance. */ From f78eb884e624ce32e4eb657b307bbf3d5bb4c39b Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Sat, 3 Sep 2022 10:53:14 +0200 Subject: [PATCH 4/8] Update index.js --- src/diff/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/diff/index.js b/src/diff/index.js index ab7b93b7c5..729082195d 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -528,7 +528,6 @@ export function unmount(vnode, parentVNode, skipRemove) { // Must be set to `undefined` to properly clean up `_nextDom` // for which `null` is a valid value. See comment in `create-element.js` - if (vnode._dom) vnode._dom._listeners = undefined vnode._children = vnode._dom = vnode._parent = vnode._dom = vnode._nextDom = undefined; } From 80a898bbf6fbe29fec112d65b391738d44907ce8 Mon Sep 17 00:00:00 2001 From: jdecroock Date: Sat, 3 Sep 2022 10:54:45 +0200 Subject: [PATCH 5/8] fix test --- compat/src/suspense.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compat/src/suspense.js b/compat/src/suspense.js index c4cdde0198..8962f662f8 100644 --- a/compat/src/suspense.js +++ b/compat/src/suspense.js @@ -143,7 +143,7 @@ Suspense.prototype._childDidSuspend = function(promise, suspendingVNode) { if (!--c._pendingSuspensionCount) { // If the suspension was during hydration we don't need to restore the // suspended children into the _children array - if (c.state._suspended) { + if (c.state._suspended && c._vnode._children) { const suspendedVNode = c.state._suspended; c._vnode._children[0] = removeOriginal( suspendedVNode, From 1a39d7078655f7db5c830f430c97afa2ce4ec40a Mon Sep 17 00:00:00 2001 From: jdecroock Date: Sat, 3 Sep 2022 11:06:54 +0200 Subject: [PATCH 6/8] add _component removal --- src/diff/index.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/diff/index.js b/src/diff/index.js index 729082195d..a638bc99d5 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -512,6 +512,7 @@ export function unmount(vnode, parentVNode, skipRemove) { } r.base = r._parentDom = null; + vnode._component = undefined; } if ((r = vnode._children)) { @@ -528,7 +529,7 @@ export function unmount(vnode, parentVNode, skipRemove) { // Must be set to `undefined` to properly clean up `_nextDom` // for which `null` is a valid value. See comment in `create-element.js` - vnode._children = vnode._dom = vnode._parent = vnode._dom = vnode._nextDom = undefined; + vnode._children = vnode._parent = vnode._dom = vnode._nextDom = undefined; } /** The `.render()` method for a PFC backing instance. */ From 4994360c10201b412081698512abbb0a191b3c29 Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 9 Sep 2022 23:21:42 +0200 Subject: [PATCH 7/8] Update index.js --- src/diff/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diff/index.js b/src/diff/index.js index a638bc99d5..390a4a8d64 100644 --- a/src/diff/index.js +++ b/src/diff/index.js @@ -529,7 +529,7 @@ export function unmount(vnode, parentVNode, skipRemove) { // Must be set to `undefined` to properly clean up `_nextDom` // for which `null` is a valid value. See comment in `create-element.js` - vnode._children = vnode._parent = vnode._dom = vnode._nextDom = undefined; + vnode._parent = vnode._dom = vnode._nextDom = undefined; } /** The `.render()` method for a PFC backing instance. */ From 04eaeb4218c6e7892970e9c837222f1a8f3f63af Mon Sep 17 00:00:00 2001 From: Jovi De Croock Date: Fri, 9 Sep 2022 23:22:01 +0200 Subject: [PATCH 8/8] Update suspense.js --- compat/src/suspense.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/compat/src/suspense.js b/compat/src/suspense.js index 8962f662f8..c4cdde0198 100644 --- a/compat/src/suspense.js +++ b/compat/src/suspense.js @@ -143,7 +143,7 @@ Suspense.prototype._childDidSuspend = function(promise, suspendingVNode) { if (!--c._pendingSuspensionCount) { // If the suspension was during hydration we don't need to restore the // suspended children into the _children array - if (c.state._suspended && c._vnode._children) { + if (c.state._suspended) { const suspendedVNode = c.state._suspended; c._vnode._children[0] = removeOriginal( suspendedVNode,