From d81d3ebaefd5ec6f7a47750240f3997e23284a15 Mon Sep 17 00:00:00 2001 From: Evan Almloff Date: Mon, 11 Sep 2023 16:16:16 -0500 Subject: [PATCH] assign parents through fragments --- packages/core/src/create.rs | 2 +- packages/core/src/diff.rs | 13 ++++++++----- packages/core/src/virtual_dom.rs | 3 +++ packages/core/tests/event_propagation.rs | 1 + 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/core/src/create.rs b/packages/core/src/create.rs index 7db744cf5..783842d45 100644 --- a/packages/core/src/create.rs +++ b/packages/core/src/create.rs @@ -485,7 +485,7 @@ impl<'b> VirtualDom { Text(text) => self.create_dynamic_text(parent, text), Placeholder(place) => self.create_placeholder(place, parent), Component(component) => self.create_component_node(Some(parent), component), - Fragment(frag) => frag.iter().map(|child| self.create(child)).sum(), + Fragment(frag) => self.create_children(*frag, Some(parent)), } } diff --git a/packages/core/src/diff.rs b/packages/core/src/diff.rs index 20358cfce..10cdbeb88 100644 --- a/packages/core/src/diff.rs +++ b/packages/core/src/diff.rs @@ -776,15 +776,18 @@ impl<'b> VirtualDom { .sum() } - fn create_children( + pub(crate) fn create_children( &mut self, nodes: impl IntoIterator>, parent: Option, ) -> usize { - nodes.into_iter().fold(0, |acc, child| { - self.assign_boundary_ref(parent, child); - acc + self.create(child) - }) + nodes + .into_iter() + .map(|child| { + self.assign_boundary_ref(parent, child); + self.create(child) + }) + .sum() } fn create_and_insert_before( diff --git a/packages/core/src/virtual_dom.rs b/packages/core/src/virtual_dom.rs index 60727cb42..332376627 100644 --- a/packages/core/src/virtual_dom.rs +++ b/packages/core/src/virtual_dom.rs @@ -379,9 +379,11 @@ impl VirtualDom { let template = unsafe { el_ref.unwrap().as_ref() }; let node_template = template.template.get(); let target_path = path.path; + println!("handle_event: {:?} ({:?})", target_path, template); for (idx, attr) in template.dynamic_attrs.iter().enumerate() { let this_path = node_template.attr_paths[idx]; + println!("checking: {:?} ({:?})", this_path, attr); // Remove the "on" prefix if it exists, TODO, we should remove this and settle on one if attr.name.trim_start_matches("on") == name @@ -401,6 +403,7 @@ impl VirtualDom { // Now that we've accumulated all the parent attributes for the target element, call them in reverse order // We check the bubble state between each call to see if the event has been stopped from bubbling for listener in listeners.drain(..).rev() { + println!("handle_event: {:?}", listener); if let AttributeValue::Listener(listener) = listener { let origin = path.scope; self.runtime.scope_stack.borrow_mut().push(origin); diff --git a/packages/core/tests/event_propagation.rs b/packages/core/tests/event_propagation.rs index be59c3fad..d694b1ff1 100644 --- a/packages/core/tests/event_propagation.rs +++ b/packages/core/tests/event_propagation.rs @@ -55,6 +55,7 @@ fn problematic_child(cx: Scope) -> Element { render! { button { onclick: move |evt| { + println!("bottom clicked"); let mut clicks = CLICKS.lock().unwrap(); if *clicks == 3 {