[FIX] components: avoid leaks when children are outdated/destroyed

Every use case involving some sort of key set on a component would give birth to a leak in an async context:
- If a key of a component changed, the outdated one was never destroyed.
- destroyed component were never removed from their parent's reference map.

This commit solves both issues, that are tightly linked anyway.
This commit is contained in:
Lucas Perais (lpe)
2022-01-11 17:30:56 +01:00
committed by Aaron Bohy
parent 38f39b6755
commit c221721d7f
7 changed files with 411 additions and 1 deletions
+18
View File
@@ -276,6 +276,7 @@ export class ComponentNode<T extends typeof Component = typeof Component>
patch() {
this.bdom!.patch(this!.fiber!.bdom!, false);
this.cleanOutdatedChildren();
this.fiber!.appliedToDom = true;
this.fiber = null;
}
@@ -287,4 +288,21 @@ export class ComponentNode<T extends typeof Component = typeof Component>
remove() {
this.bdom!.remove();
}
cleanOutdatedChildren() {
const childrenEntries = Object.entries(this.children);
if (!childrenEntries.length) {
return;
}
const children = this.children;
for (const [key, node] of childrenEntries) {
const status = node.status;
if (status !== STATUS.MOUNTED) {
delete children[key];
if (status !== STATUS.DESTROYED) {
node.destroy();
}
}
}
}
}