diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs
index 667c7123d..52ea1f245 100644
--- a/packages/core/src/arena.rs
+++ b/packages/core/src/arena.rs
@@ -77,6 +77,10 @@ impl VirtualDom {
pub(crate) fn update_template(&mut self, el: ElementId, node: &VNode) {
let bubble_id = self.elements[el.0].unwrap();
+ self.update_template_bubble(bubble_id, node)
+ }
+
+ pub(crate) fn update_template_bubble(&mut self, bubble_id: BubbleId, node: &VNode) {
let node: *const VNode = node as *const _;
self.element_refs[bubble_id.0].template = unsafe { std::mem::transmute(node) };
}
@@ -128,6 +132,9 @@ impl VirtualDom {
self.drop_scope(f, true);
}
c.props.take();
+ if let Some(bubble_id) = c.bubble_id.get() {
+ self.element_refs.remove(bubble_id.0);
+ }
}
DynamicNode::Fragment(nodes) => {
nodes.iter().for_each(|node| self.drop_scope_inner(node))
diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs
index 5e015dbb3..b394f5e83 100644
--- a/packages/core/src/diff.rs
+++ b/packages/core/src/diff.rs
@@ -214,6 +214,10 @@ impl<'b> VirtualDom {
let scope_id = left.scope.get().unwrap();
right.scope.set(Some(scope_id));
+ if let Some(bubble_id) = left.bubble_id.get() {
+ right.bubble_id.set(Some(bubble_id));
+ self.update_template_bubble(bubble_id, parent.unwrap().template);
+ }
// copy out the box for both
let old = self.scopes[scope_id.0].props.as_ref();
diff --git a/packages/core/src/nodes.rs b/packages/core/src/nodes.rs
index 1cf15a28c..f3a27eecf 100644
--- a/packages/core/src/nodes.rs
+++ b/packages/core/src/nodes.rs
@@ -318,9 +318,12 @@ pub struct VComponent<'a> {
/// The assigned Scope for this component
pub(crate) scope: Cell