diff --git a/packages/core/src/arena.rs b/packages/core/src/arena.rs index dd061eae8..aacd4dbf2 100644 --- a/packages/core/src/arena.rs +++ b/packages/core/src/arena.rs @@ -78,7 +78,7 @@ impl VirtualDom { } } - pub(crate) fn update_template(&mut self, el: ElementId, node: &VNode) { + pub(crate) fn update_template(&mut self, el: ElementId, node: *const VNode) { let bubble_id = self.elements[el.0].unwrap(); self.update_template_bubble(bubble_id, node) } @@ -135,7 +135,7 @@ impl VirtualDom { } c.props.take(); if let Some(bubble_id) = c.bubble_id.get() { - self.element_refs.remove(bubble_id.0); + self.element_refs.try_remove(bubble_id.0); } } DynamicNode::Fragment(nodes) => { diff --git a/packages/core/src/create.rs b/packages/core/src/create.rs index 76182b976..0b77b9417 100644 --- a/packages/core/src/create.rs +++ b/packages/core/src/create.rs @@ -547,6 +547,7 @@ impl<'b> VirtualDom { // Create the component's root element Ready(t) => { self.assign_boundary_ref(parent, t); + component.bubble_id.set(t.parent.get()); self.create_scope(scope, t) } Aborted(t) => self.mount_aborted(t, parent), diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 3ba2f6bf8..6e53c7c3f 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -174,7 +174,9 @@ impl<'b> VirtualDom { (Fragment(left), Fragment(right)) => self.diff_non_empty_fragment(left, right, parent), (Placeholder(left), Placeholder(right)) => { right.id.set(left.id.get()); - right.parent.set(left.parent.get()) + right.parent.set(left.parent.get()); + // Update the template + self.update_template(left.id.get().unwrap(), parent.template); }, (Component(left), Component(right)) => self.diff_vcomponent(left, right, Some(parent)), (Placeholder(left), Fragment(right)) => self.replace_placeholder(left, *right, parent), @@ -214,10 +216,7 @@ 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); - } + right.bubble_id.set(left.bubble_id.get()); // copy out the box for both let old = self.scopes[scope_id.0].props.as_ref(); @@ -236,6 +235,16 @@ impl<'b> VirtualDom { // Now run the component and diff it self.run_scope(scope_id); + if let Some(bubble_id) = right.bubble_id.get() { + if let RenderReturn::Ready(new_node) = unsafe { + self.scopes[scope_id.0] + .current_frame() + .try_load_node() + .expect("Call rebuild before diffing") + } { + self.update_template_bubble(bubble_id, new_node); + } + } self.diff_scope(scope_id); self.dirty_scopes.remove(&DirtyScope {