From e0390ff608d4907820cf1d7376d3ba3f4ffabc6f Mon Sep 17 00:00:00 2001 From: Jonathan Kelley Date: Fri, 16 Dec 2022 22:39:27 -0800 Subject: [PATCH] fix: advance dynamic root --- examples/flat_router.rs | 29 ++++++++++++++--------------- packages/core/src/create.rs | 12 +++++++++--- packages/core/src/diff.rs | 8 ++++---- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/examples/flat_router.rs b/examples/flat_router.rs index 752b58760..4de9e7a7d 100644 --- a/examples/flat_router.rs +++ b/examples/flat_router.rs @@ -7,7 +7,6 @@ fn main() { let cfg = Config::new().with_window( WindowBuilder::new() - .with_title("Spinsense Client") .with_inner_size(LogicalSize::new(600, 1000)) .with_resizable(false), ); @@ -17,21 +16,21 @@ fn main() { fn app(cx: Scope) -> Element { cx.render(rsx! { - Router { - Route { to: "/", "Home" } - Route { to: "/games", "Games" } - Route { to: "/play", "Play" } - Route { to: "/settings", "Settings" } + div { + Router { + Route { to: "/", "Home" } + Route { to: "/games", "Games" } + Route { to: "/play", "Play" } + Route { to: "/settings", "Settings" } - p { - "----" - } - nav { - ul { - Link { to: "/", li { "Home" } } - Link { to: "/games", li { "Games" } } - Link { to: "/play", li { "Play" } } - Link { to: "/settings", li { "Settings" } } + p { "----" } + nav { + ul { + Link { to: "/", li { "Home" } } + Link { to: "/games", li { "Games" } } + Link { to: "/play", li { "Play" } } + Link { to: "/settings", li { "Settings" } } + } } } } diff --git a/packages/core/src/create.rs b/packages/core/src/create.rs index 834b62437..19591c679 100644 --- a/packages/core/src/create.rs +++ b/packages/core/src/create.rs @@ -44,7 +44,10 @@ impl<'b> VirtualDom { .iter() .enumerate() .map(|(idx, root)| match root { - DynamicText { id } | Dynamic { id } => self.write_dynamic_root(node, *id), + DynamicText { id } | Dynamic { id } => { + nodes.next().unwrap(); + self.write_dynamic_root(node, *id) + } Element { .. } => self.write_element_root(node, idx, &mut attrs, &mut nodes), Text { .. } => self.write_static_text_root(node, idx), }) @@ -63,7 +66,7 @@ impl<'b> VirtualDom { use DynamicNode::*; match &template.dynamic_nodes[idx] { node @ Fragment(_) => self.create_dynamic_node(template, node, idx), - node @ Component { .. } => self.create_dynamic_node(template, node, idx), + node @ Component { .. } => dbg!(self.create_dynamic_node(template, node, idx)), Placeholder(VPlaceholder { id }) => { let id = self.set_slot(template, id, idx); self.mutations.push(CreatePlaceholder { id }); @@ -131,7 +134,10 @@ impl<'b> VirtualDom { ) { let (start, end) = match collect_dyn_node_range(dynamic_nodes, root_idx) { Some((a, b)) => (a, b), - None => return, + None => { + println!("No dynamic nodes found for root {}", root_idx); + return; + } }; for idx in (start..=end).rev() { diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 6b7797d46..84baa5b32 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -711,8 +711,11 @@ impl<'b> VirtualDom { fn replace(&mut self, left: &'b VNode<'b>, right: impl IntoIterator>) { let m = self.create_children(right); + let id = self.find_last_element(left); + self.mutations.push(Mutation::InsertAfter { id, m }); + self.remove_node(left, true); } @@ -735,10 +738,7 @@ impl<'b> VirtualDom { /// Remove these nodes from the dom /// Wont generate mutations for the inner nodes fn remove_nodes(&mut self, nodes: &'b [VNode<'b>]) { - nodes - .iter() - .rev() - .for_each(|node| self.remove_node(node, true)); + nodes.iter().for_each(|node| self.remove_node(node, true)); } fn remove_node(&mut self, node: &'b VNode<'b>, gen_muts: bool) {