update vnode ptr when parent of component reruns

This commit is contained in:
Evan Almloff committed 2023-09-04 09:57:26 -05:00
1 parent cfc6887e34
commit d26aa95bcd
3 files changed
+17 -7

No files matched your search

+2 -2
View File
@@ -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) => {
+1
View File
@@ -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),
+14 -5
View File
@@ -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 {